首页 > 解决方案 > 为什么这个 RewriteRule 对除 .php 之外的所有扩展都有效?

问题描述

我用来练习 .htaccess 文件的这个简单的 RewriteRule 几乎总是有效的:

RewriteEngine on
RewriteRule ^.*$ test.html

当我拥有该文件flowers.html并使用http://localhost/flowers时,我会被重定向到test.html,但是当我重命名为时flowers.htmlflowers.php我会得到一个带有消息的 404 页面The requested URL /flowers was not found on this server。有谁知道这是什么原因?

编辑:flowers当我创建一个名为它 的空文件时,它会正确重定向到test.html. 这里发生了什么?

标签: .htaccessapache2

解决方案


这听起来确实与 冲突MultiViews,因此请尝试在文件顶部添加以下内容.htaccess以禁用MultiViews

Options -MultiViews

MultiViews 默认情况下未启用,所以也许这已在您的服务器配置中启用?

当启用 MultiViews(mod_negotiation 的一部分)时,对/flowers(无扩展名)的请求将导致 Apache 通过尝试在该目录中找到的文件的各种文件扩展名来搜索要返回的适当文件(基于 mime 类型)。这是在 mod_rewrite 运行之前通过内部子请求实现的。

但是,如果您没有其他指令,尚不清楚为什么在您的情况下这会是一个问题?由于您的指令只是将所有内容重写为test.html(应包括任何子请求)。(我无法在我的 Apache 2.4 测试服务器上重现这种行为 - 因此我最初怀疑。)


推荐阅读