
Сервер: 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 [email protected]
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 правильный. Я знаю, что мой путь хорош, просто условия по какой-то причине не выполняются.
решение1
Для тех, кто использует 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
Остальное просто. Обалденный соус. Надеюсь, это поможет!