开发者

How to prevent Apache / mod_rewrite from treating path as file with same name

开发者 https://www.devze.com 2023-04-11 14:08 出处:网络
I\'m using WAMP Server, mostly configured as-is out of the box.I\'m having trouble getting mod_rewrite to behave as expected locall开发者_C百科y (everything works fine on a production server).

I'm using WAMP Server, mostly configured as-is out of the box. I'm having trouble getting mod_rewrite to behave as expected locall开发者_C百科y (everything works fine on a production server).

I have a PHP file located at: /ajax/graphs/get-graph.php

The way this file is normally invoked is via a bootstrap file loaded by /index.php

I have a .htaccess file at the root with the following rules:

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

So, basically, when my app requests via AJAX a call to /ajax/graphs/get-graph/it should be directed to /index.php.

The problem is, Apache/mod_rewrite sees the request path and loads /ajax/graphs/get-graph.php directly.

How do I prevent Apache from assuming that /ajax/graphs/get-graph/ is a valid file because a php file of the same name exists at that location?


It sounds like you've fallen into the trap of content negotiation ;-) As explained in the Apache documentation, there is an option called MultiViews which, when enabled, causes Apache to basically convert nonexistent directory names into their corresponding filenames.

The effect of MultiViews is as follows: if the server receives a request for /some/dir/foo, if /some/dir has MultiViews enabled, and /some/dir/foo does not exist, then the server reads the directory looking for files named foo.*, and effectively fakes up a type map which names all those files...

The intent is that you can have several versions of a file in different formats or languages, like

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

and Apache will choose the best one based on the preferences provided by the browser.

To fix it, all you should need to do is add the directive

Options -MultiViews

in a <Directory> or <Location> block corresponding to /ajax/graphs. Or, if you don't have access to the main server configuration, you can put it in /ajax/graphs/.htaccess.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号