Как запретить Apache / mod_rewrite рассматривать путь как файл с тем же именем
Я использую сервер WAMP, в основном настроенный как есть из коробки. У меня проблемы с тем, чтобы 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 ответ
Похоже, вы попали в ловушку согласования контента;-) Как объясняется в документации по 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
,