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

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 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

Остальное легко. Потрясающий соус. Надеюсь это поможет!