我有一个LAMP堆栈。 我正在使用下面的.htaccess文件来自动将请求映射到.php文件:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
所以如果我浏览http://example.com/asdf,“asdf.php ”文件将被加载。
但是,如果我创build一个名称相同的.css文件(即“asdf.css”),那么服务器在浏览到没有扩展名的名称时返回css文件而不是PHP文件。 也似乎发生的.txt文件扩展名,可能是任何其他三个字符的扩展名(虽然不会发生.js文件)。
我不明白为什么会这样。 我对重写规则集的理解是这样的:1)如果被请求的文件不存在THEN 2)如果文件名不包含句点,则将请求redirect到[filename] .php
这怎么能返回一个.txt或.css文件,特别是当匹配的.php文件存在时? 我在这里错过了什么?
谢谢!
如果您有多个具有相同基本名称的文件,那么听起来您可能与MultiViews有冲突。 尝试在.htaccess文件(或服务器configuration)中禁用此项:
Options -MultiViews
MultiViews (mod_negotiation的一部分)和mod_rewrite做的事情是一样的,我怀疑是“胜利”。 当您请求/asdf和asdf映射到文件基本名称时, MultiViews尝试提供与预期的MIMEtypes匹配的相应文件(这可能解释为什么.js文件会被忽略)。
我对重写规则集的理解是这样的:1)如果被请求的文件不存在THEN 2)如果文件名不包含句点,则将请求redirect到[filename] .php
否则,你对mod_rewrite指令的理解是非常正确的,除了顺序是相反的(首先处理RewriteRule 模式 )…
.php扩展名来内部重写请求。 RewriteRule ^([^\.]+)$ $1.php [NC,L]
在字符类中不需要转义文字, NC标志在这里是多余的。