Apache2 mod_rewrite Чистый URL - работает, но файлы недоступны

Apache2 mod_rewrite Чистый URL - работает, но файлы недоступны

Сервер: 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

Остальное просто. Обалденный соус. Надеюсь, это поможет!

Связанный контент