Назад | Перейти на главную страницу

Что такое RewriteCond в файлах .htaccess

У меня проблемы с пониманием того, как работает директива RewriteCond. Пока довольно ясно, что он сравнивает со строками, чтобы применить RewriteRule. У меня есть этот файл:

<IfModule rewrite_module>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app_dev.php
</IfModule>

У меня это работает, но я не знаю, почему это работает. Пока что в директиве RewriteCond я понимаю:

если значение REQUEST_FILENAME НЕ является файлом на жестком диске, тогда разрешите правило

В этом нет смысла, потому что app_dev.php после подстановки является файлом на жестком диске. В любом случае, может кто-нибудь просветить меня по этой проблеме? Мне очень сложно понять, как это работает.

Если вы запросили /styles/main.css тогда это бы быть файлом в файловой системе, и RewriteRule не будет обработан. Apache просто обслужит файл.

Если вы запросите /foo/bar и этого не существует, RewriteRule обрабатывается, и запрос становится /app_dev.php однако PHP все еще имеет доступ к исходному URL-адресу до того, как произошла перезапись. Используя это, фреймворк, такой как symfony, может обслуживать разные страницы для разных URL-адресов, даже если файл PHP всегда один и тот же.

Это фактический путь к файлу в вашей реальной файловой системе.

Итак, если ваш DocumentRoot является /var/www и вы просите /styles/main.css, затем при использовании в контексте каталога / htaccess %{REQUEST_FILENAME} является /var/www/styles/main.css - и !-f проверяет, существует ли этот файл, и позволяет RewriteRule возникает, если его не существует.

Обратите внимание, что он ведет себя по-другому и не будет включать корень документа, если он не используется в контексте каталога / htaccess, как описано в документация:

REQUEST_FILENAME

Полный путь локальной файловой системы к файлу или сценарию, соответствующему запросу, если он уже был определен сервером во время ссылки на REQUEST_FILENAME. В противном случае, например, при использовании в контексте виртуального хоста, то же значение, что и REQUEST_URI.