Перезапись Apache vhost не работает с существующими папками

Я хочу, чтобы мой виртуальный хост переписывал такие URL-адреса, как:
http://dev.example.com/cool/story/bro

Кому:
http://dev.example.com/index.php?url=cool/story/bro

Если не указан существующий файл, такой как:
http://dev.example.com/images/duck.png


Это работает нормально, но когда у меня есть URL-адрес, который использует существующую папку, например:
http://dev.example.com/images

Он странно перенаправляет на:
http://dev.example.com/images/?url=images

Когда его следует переписать на:
http://dev.example.com/index.php?url=images


Вот мой текущий код:

<VirtualHost *:80>
        ServerName dev.example.com
        DocumentRoot /var/www/dev/public

        php_flag display_errors 1
        php_value error_reporting 30719

        <Directory "/var/www/dev/public">
                RewriteBase /
                RewriteEngine On
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteRule ^(.*)$ index.php?url=$1 [L]
        </Directory>
</VirtualHost>

Я пытался исправить это в течение нескольких часов, но я не вижу проблемы, надеюсь, вы можете помочь.


person Lenton    schedule 19.05.2013    source источник


Ответы (2)


Вы захотите указать RewriteCond для путей, которые являются существующими каталогами в дополнение к тем, которые являются существующими файлами.

RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ index.php?url=$1 [L]
person Chris    schedule 19.05.2013
comment
Это просто заставляет его показывать каталог, который мне не нужен. Его следует переписать на dev.example.com/index.php?url=images как и другие. - person Lenton; 19.05.2013
comment
Нет, это по-прежнему перенаправляет на /images/?url=images РЕДАКТИРОВАТЬ: Тем не менее, он по-прежнему использует /index.php. Может быть, это цикл и применение перезаписи дважды? Может быть, какие-то советы о том, как отладить это, чтобы проверить? - person Lenton; 20.05.2013
comment
Тестирование на моих собственных серверах, вышеизложенное должно работать как задумано. Я бы попробовал удалить RewriteBase и указать косую черту перед index.php. Или вы можете попробовать использовать полный путь /var/www/dev/public, чтобы исключить это. - person Chris; 20.05.2013
comment
Я пробовал оба, и это все еще происходит. Есть ли способ точно увидеть, что Apache делает с запросом? - person Lenton; 20.05.2013
comment
@ChrisHendry Спасибо за совет по отладке. - person Tyzoid; 15.03.2014

Я пришел искать решение этой же проблемы, и комментарий @Chris Hendry, предлагающий журнал перезаписи, очень помог в отладке.

Не совсем, но вы можете зарегистрировать действия перезаписи в журнале, за которым вы могли бы следить. RewriteLog "/path/to/file/rewrite.log" RewriteLogLevel 3 httpd.apache.org/docs/2.2/mod/mod_rewrite.html#RewriteLogLevel — Крис Хендри

Я проследил проблему до Apache, автоматически добавляющего косую черту всякий раз, когда папка запрашивается без нее, как показано здесь: https://stackoverflow.com/questions/13354238#answer-13354276

Apache видит, что каталог был запрошен, и вызывает перенаправление 301 в «правильное» местоположение.

Проблема была исправлена ​​для меня, когда я добавил эту директиву в свой файл .htaccess (в вашем случае она должна работать в самом виртуальном хосте):

DirectorySlash Off

Изменить. Обязательно очистите кеш перед повторным тестированием. Редирект 301 — это кеш.

person Tyzoid    schedule 15.03.2014