我有一个 LAMP 堆栈。我正在使用以下 .htaccess 文件自动将请求映射到 .php 文件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
因此,如果我浏览到http://example.com/asdf,则会加载“asdf.php”文件。
但是,如果我创建一个具有相同名称的 .css 文件(即“asdf.css”),那么当浏览到没有扩展名的名称时,服务器会返回 css 文件而不是 PHP 文件。.txt 文件扩展名似乎也会发生,并且可能任何其他三字符扩展名都会发生(尽管 .js 文件不会发生)。
我不明白为什么会这样。我对重写规则集的理解是:1)如果请求的文件不存在,那么 2)如果文件名不包含句点,则将请求重定向到 [filename].php
这怎么可能返回 .txt 或 .css 文件,尤其是当匹配的 .php 文件存在时?我在这里想念什么?
谢谢!
如果您有多个具有相同基本名称的文件,那么听起来您可能与
MultiViews
. 尝试在您的.htaccess
文件(或服务器配置)中禁用此功能:MultiViews
(mod_negotiation 的一部分)与您尝试使用 mod_rewrite 做的事情相同,我怀疑是“获胜”。当您请求/asdf
并asdf
映射到文件基名时,然后MultiViews
尝试提供与预期 mime 类型匹配的适当文件(这可以解释.js
文件丢失的原因)。否则,您对 mod_rewrite 指令的理解非常正确,只是顺序相反(首先处理
RewriteRule
模式).......php
通过附加扩展在内部重写请求。没有必要在字符类中转义文字句点,并且
NC
标志在这里是多余的。