Почему перезаписывается % {имя файла запроса}!-D в обязательном порядке?

Почему это .htaccess работать при обращении example.com/mywebsite/

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php

если это не удается (404):

RewriteEngine On
RewriteRule ^(.*)$ index.php

Я думал, что второе решение должно также работать.

1 ответов


чтобы объяснить это поведение, нам нужно сделать некоторые предположения о вашей файловой системе, и под "работой" вы подразумеваете, что файл обслуживается (вы не видите список каталогов)...

на .htaccess файл находится в корне документа и /mywebsite - это физический каталог, содержащий (или DirectoryIndex документ). Нет index.php файл в корне документа. Другими словами:

example.com/
    .htaccess
    mywebsite/
        index.php

в этом сценарии, когда вы запрашиваете example.com/mywebsite/ в происходит следующее:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php

/mywebsite/ является физическим каталогом, поэтому первое условие не выполняется и RewriteRule не обрабатывается.

mod_dir затем ищет DirectoryIndex находит index.php и .htaccess файл переработан. Теперь это сопоставляется с физическим файлом, поэтому второе условие не выполняется и RewriteRule не обрабатывается.

в результате example.com/mywebsite/index.php получает просила. Так же, как если бы не было - это.

нет index.php файл в корне документа; следовательно, 404.

почему RewriteCond %{REQUEST_FILENAME} !-d обязательный?

является ли это обязательным или нет, на самом деле зависит от вашей файловой системы и того, что вы пытаетесь сделать. Но, как правило, вы обычно не хотите, чтобы физические каталоги обрабатывались фронт-контроллера.

на !-f условие обычно более важно, так как вы часто не хотите, чтобы физические файлы обрабатывались фронт-контроллера. Это необходимо, когда вы хотите обслуживать статические ресурсы (например. стиль CSS, JavaScript и изображения) из той же области в файловой системе. Однако вы можете опустить эту директиву, если хотите контролировать доступ к некоторым физическим файлам (возможно, раздел "Загрузка") через передний контроллер.