2015-08-06 1 views
0

Я выделил нечетный случай с mod_rewrite на стандартной установке Apache. Рассмотрим Правило, которое перезаписывает все запросы на файл с именем test.html в корне:Apache не переписывает URL-адреса, содержащие файл в пути запроса

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    RewriteRule ^(.*)$ test.html [L] 
</IfModule> 

test.html единственный файл в файловой системе.

Вот что происходит, когда я делаю некоторые запросы:

Request     | Result    | Status 
---------------------------------------------------------- 
example.com/test.html  | example.com/test.html | 200 
example.com/foo   | example.com/test.html | 200 
example.com/foo.html  | example.com/test.html | 200 
example.com/foo/bar  | example.com/test.html | 200 
example.com/foo/bar.html | example.com/test.html | 200 
example.com/test/bar  | [error Not Found]  | 404 
example.com/test/bar.html | [error Not Found]  | 404 

Error messages for the last two requests: 
The requested URL /test.html/bar was not found on this server 
The requested URL /test.html/bar.html was not found on this server.  

Я пробовал все виды RewriteRules, но я не могу предотвратить ошибки, без физического добавления нового каталога с именем test.

Почему это происходит?

Есть ли способ отменить это поведение?

+0

Хрустальный шар дикий догадку: это пахнет [типами карт/содержанием переговоров] (http://httpd.apache.org/docs/2.2/en/content-negotiation.html), что может привести к ИМО полностью удивительное поведение. –

ответ

1

Добавьте эту строку в .htaccess отключить MultiViews:

Options -MultiViews 

Apache docs on mod_negotiation, описывает то, что делает MultiViews вариант, когда включен:

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

+0

Это было! Когда вы говорите «Если сервер получает запрос ... и т. Д.», Вы описываете, что происходит, когда Multivews включен? – bryanbraun

+0

Да, это все. В вашем случае это необходимо отключить. – Croises

Смежные вопросы