【问题标题】:Htaccess optional trailing slash when associating extensionless url with php将无扩展名 url 与 php 关联时,Htaccess 可选尾部斜杠
【发布时间】:2019-01-12 21:33:20
【问题描述】:
我使用以下规则将无扩展名 url 与 php 文件相关联。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)/$ $1.php [NC,L]
无论结尾的斜杠如何,我都想将其更改为有效。
^([^\.]+)/$
适用于 /example/
^([^\.]+)$
与 /example 一起使用
^([^\.]+)/?$
尝试使用斜线是可选的,但没有得到想要的结果。
【问题讨论】:
标签:
php
regex
.htaccess
mod-rewrite
【解决方案1】:
^([^\.]+)/?$
这不会按预期工作,因为正则表达式在默认情况下是“贪婪的”,因此捕获的模式会消耗尾部斜杠,因为它在 URL 路径的末尾是 可选。换句话说,对/foo/ 的请求最终会被重写为foo/.php,而不是预期的foo.php。
您需要使用+? 而不是+,使捕获的组不贪婪。
例如:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+?)/?$ $1.php [L]
另外...
-
RewriteRule 指令上的 NC 标志是多余的。
- 无需对字符类中的文字点进行转义。
- 您应该确保
MultiViews 被禁用(以避免将来可能发生的冲突,如果还没有的话。)
除此之外: 但是,通过将 /foo/ 和 /foo 解析到同一页面,您可能会创建规范化问题/重复内容。您应该决定哪个是规范的,外部重定向一个到另一个。