У меня проблемы с пониманием того, как работает директива 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.