将无扩展名的URL与PHP关联时的HTAccess可选尾部斜杠

时间:2019-01-12 21:33:20

标签: php regex .htaccess mod-rewrite

我使用以下规则将无扩展名的url与php文件相关联。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)/$ $1.php [NC,L]

无论结尾的斜杠是什么,我都希望将其更改为有效。

^([^\.]+)/$

使用/ example /

^([^\.]+)$

使用/ example

^([^\.]+)/?$

尝试使用其中斜杠为可选项但未获得所需结果的情况。

1 个答案:

答案 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都解析到同一页面,可能会导致规范化问题/重复内容。您应该确定哪个是规范的,然后外部重定向一个。