Как запретить Apache / mod_rewrite рассматривать путь как файл с тем же именем - PullRequest
1 голос
/ 05 октября 2011

Я использую WAMP Server, в основном настроенный как есть из коробки. У меня возникают проблемы с тем, что mod_rewrite ведет себя так, как ожидается, локально (на рабочем сервере все работает нормально).

У меня есть файл PHP, расположенный по адресу: /ajax/graphs/get-graph.php

Обычно этот файл вызывается с помощью файла начальной загрузки, загруженного /index.php

У меня есть файл .htaccess в корне со следующими правилами:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]

Итак, когда мое приложение запрашивает через AJAX вызов /ajax/graphs/get-graph/, оно должно быть направлено на /index.php.

Проблема в том, что Apache / mod_rewrite видит путь запроса и загружает /ajax/graphs/get-graph.php напрямую.

Как я могу запретить Apache предполагать, что /ajax/graphs/get-graph/ является допустимым файлом, поскольку в этом месте существует php-файл с тем же именем?

1 Ответ

3 голосов
/ 05 октября 2011

Звучит так, как будто вы попали в ловушку согласования контента ;-) Как объясняется в документации Apache , есть опция с именем MultiViews, которая при включении заставляет Apache в основном конвертировать несуществующие имена каталогов в соответствующие им имена файлов.

Эффект MultiViews заключается в следующем: если сервер получает запрос на /some/dir/foo, если /some/dir имеет включенные MultiViews и /some/dir/foo не существует, тогда сервер читает каталог, ища файлы с именем foo.* и эффективно подделывает карту типов, которая называет все эти файлы ...

Предполагается, что вы можете иметь несколько версий файла в разных форматах или на разных языках, например

/some/dir
- foo.en.gif
- foo.en.png
- foo.en.jpg
- foo.fr.gif
- foo.fr.png
- foo.fr.jpg

и Apache выберет лучший вариант на основе настроек, предоставленных браузером.

Чтобы исправить это, все, что вам нужно сделать, это добавить директиву

Options -MultiViews

в блоке <Directory> или <Location>, соответствующем /ajax/graphs. Или, если у вас нет доступа к конфигурации основного сервера, вы можете указать его в /ajax/graphs/.htaccess.

...