我使用以下规则将无扩展名的url与php文件相关联。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)/$ $1.php [NC,L]
无论结尾的斜杠是什么,我都希望将其更改为有效。
^([^\.]+)/$
使用/ example /
^([^\.]+)$
使用/ example
^([^\.]+)/?$
尝试使用其中斜杠为可选项但未获得所需结果的情况。
答案 0 :(得分:1)
^([^\.]+)/?$
这将无法正常工作,因为正则表达式默认情况下是“贪婪的”,因此捕获的模式会使用尾部斜杠,因为它是URL路径末尾的可选。换句话说,对/foo/
的请求最终被重写为foo/.php
,而不是预期的foo.php
。
您需要使用+?
而不是+
来使捕获的组变得非贪婪。
例如:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+?)/?$ $1.php [L]
此外...
NC
指令上的RewriteRule
标志是多余的。MultiViews
(以避免将来发生潜在冲突,如果尚未避免的话)。 旁边:但是,通过使/foo/
和/foo
都解析到同一页面,可能会导致规范化问题/重复内容。您应该确定哪个是规范的,然后外部重定向一个。