如何防止Apache / mod_rewrite将路径视为具有相同名称的文件

时间:2011-10-05 19:19:20

标签: apache .htaccess mod-rewrite wamp mod-php

我正在使用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 个答案:

答案 0 :(得分:3)

听起来你已陷入内容协商的陷阱;-)如the Apache documentation中所述,有一个名为MultiViews的选项,启用后会导致Apache基本上转换不存在的目录将名称命名为相应的文件名。

  

MultiViews的效果如下:如果服务器收到/some/dir/foo请求,如果/some/dir启用了MultiView,并且/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