为什么此 RewriteRule 适用于除 .php 以外的所有扩展名?

Why does this RewriteRule work for all extensions but .php?

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

RewriteEngine on
RewriteRule ^.*$ test.html

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

编辑: 当我创建一个名为 flowers 的空文件时,它会正确重定向到 test.html。这是怎么回事?

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

Options -MultiViews

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

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

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