Apache不会在请求路径中重写包含文件的URL

时间:2015-08-06 11:59:56

标签: apache .htaccess mod-rewrite

我在标准的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的新目录,我就无法阻止错误。

为什么会这样?

有没有办法覆盖这种行为?

1 个答案:

答案 0 :(得分:1)

.htaccess中添加此行以禁用MultiViews:

Options -MultiViews

Apache docs on mod_negotiation描述了多视图选项启用时的功能:

  

如果   服务器接收/ some / dir / foo的请求和/ some / dir / foo没有   存在,然后服务器读取目录查找所有命名的文件   foo。*,并有效地伪造了一个类型地图,列出了所有这些   文件,为它们分配相同的媒体类型和内容编码   如果客户通过名字要求其中一个,那就会有。然后呢   选择最符合客户要求的,并返回   文档。