我在标准的Apache安装上用mod_rewrite隔离了一个奇怪的例子。考虑一个规则,该规则将所有请求重写为根目录中名为test.html
的文件:
<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 :(得分:1)
在.htaccess
中添加此行以禁用MultiViews:
Options -MultiViews
Apache docs on mod_negotiation描述了多视图选项启用时的功能:
如果 服务器接收/ some / dir / foo的请求和/ some / dir / foo没有 存在,然后服务器读取目录查找所有命名的文件 foo。*,并有效地伪造了一个类型地图,列出了所有这些 文件,为它们分配相同的媒体类型和内容编码 如果客户通过名字要求其中一个,那就会有。然后呢 选择最符合客户要求的,并返回 文档。