【问题标题】: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 解析到同一页面,您可能会创建规范化问题/重复内容。您应该决定哪个是规范的,外部重定向一个到另一个。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2011-09-13
      • 2018-04-02
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      相关资源
      最近更新 更多