Сервер: Debian Jessie Apache: 2.4.9-1 PHP: 5.5
Я хочу, чтобы все нефайлы и некаталоги перенаправлялись на index.php, где я их обрабатываю сам. Из-за характера моего проекта я должен работать на виртуальном хосте.
Я использую виртуальный хостинг (vHosts) вместе с mod_rewrite в веб-проекте, над которым я работаю. Вот файл vHost ...
<VirtualHost *:80>
ServerName foo.com
ServerAlias www.foo.com
ServerAdmin admin@foo.com
DocumentRoot /srv/foo/main/www/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
VHost работает должным образом, а правила перезаписи перенаправляют запросы на index.php, как и ожидалось. Однако, когда я пытаюсь получить доступ к файлам на сервере, например:
foo.com/css/style.css
находится в:
/srv/foo/main/www/css/style.css
мой запрос перенаправлен на index.php
Это странно, поскольку операторы условия перезаписи должны это исправить.
Для всех папок установлены права доступа 755, для всех файлов - 644.
Я смог без сомнения подтвердить, что условия перезаписи совпадают, хотя они не должны совпадать. Я смог убедиться в этом, посмотрев журнал ошибок apache с включенным отладочным выводом для mod_rewrite.
Почему два оператора RewriteCond неправильно совпадают?
Возможно, они не видят vHost DocumentRoot?
ОБНОВЛЕНИЕ: выключение механизма перезаписи позволяет мне получить доступ к файлу, с которым я тестирую. IE, мой URI правильный. Я знаю, что мой путь хорош, условия по какой-то причине не работают.
Для тех, кто использует Apache 2.4 с виртуальными хостами и желает использовать mod_rewrite внутри указанного vHost с условиями перезаписи, которые должны проверять файлы или папки внутри vHost, вот как выполнить условия перезаписи ...
<VirtualHost *:80>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
Я придумал это, и, похоже, он работает хорошо.
Объяснение...
%{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI}
предоставит вам контекстно-зависимый корень документа. IE, корень документа ПОСЛЕ виртуального хостинга был применен. Но он не даст вам URI, поэтому нам нужно добавить %{REQUEST_URI}
чтобы закончить работу.
CONTEXT_DOC_ROOT == / srv / foo / main / www
REQUEST_URI == /css/style.css
CONTEXT_DOC_ROOT + REQUEST_URI == /srv/foo/main/www/css/style.css
Остальное легко. Потрясающий соус. Надеюсь это поможет!