Проблема mod_rewrite: RewriteCond% {REQUEST_FILENAME}! -f совпадает, даже если REQUEST_FILENAME не должно (полностью) совпадать - PullRequest
4 голосов
/ 06 сентября 2011

По некоторым причинам это правило

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./rewrite.php?p=$1&%{QUERY_STRING} [L]

не работает для URL-адресов, подобных этому http://site.com/index/var/val
Все остальные URL-адреса работают, но это не так.Он начинает работать, когда я удаляю часть! -F или переименовываю файл index.php, расположенный в корне, во что-то другое (например, test.php).Итак, каким-то образом site.com/index кажется равным site.com/index.php в глазах mod_rewrite?Файлы расположены в корне, поэтому не должно быть никаких других (верхних) файлов .htaccess.Это происходит не только с индексами, например, если я создаю /something.xml, test.com/something / ... внезапно перестанет работать.Это происходит только на некоторых серверах.

Кто-нибудь знает, почему это может происходить?

PS.Каталог / index на этом сервере отсутствует

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Неисправный модуль: mod_negotiation , а не mod_rewrite.

В debian:

a2dismod negotiation

Редактировать:

Чтобы быть более конкретным, это эффект Multiviews , который обрабатывается mode_negotiation.Таким образом, вы можете оставить модуль и удалить обработку MultiViews с помощью:

Options -MultiViews

Из документации:

Поиск в MultiViews включается в параметрах MultiViews.Если сервер получает запрос для / some / dir / foo и / some / dir / foo не существует, то сервер читает каталог, ища все файлы с именем foo. *, И эффективно подделывает карту типов, которая называет все этифайлы, присваивая им те же типы носителей и кодировки контента, которые были бы у него, если бы клиент запросил один из них по имени.Затем он выбирает лучшее соответствие требованиям клиента и возвращает этот документ.

0 голосов
/ 27 сентября 2011

Я также решил эту проблему, удалив ключевое слово MultiViews из раздела

<Directory>

из конфигурации моего сервера.

Надеюсь, это поможет.

Я считаю,${REQUEST_FILENAME} обращается к файлу так, как если бы он был передан в браузер напрямую.

У меня была похожая проблема с этим:

  • /content/detailed-page (переписан URL и проанализирован php)

Файл был возвращен мне так же, как:

  • /content/detailed-page.html (реальный файл)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...