【问题标题】:Safely escape period/dot (.) character in .htaccess mod_rewrite regex在 .htaccess mod_rewrite 正则表达式中安全地转义句点/点 (.) 字符
【发布时间】:2016-03-31 13:46:46
【问题描述】:

我有一个.htaccess 文件,供我的 osCommerce 网站上安装的高级 SEO URL php 系统使用。

它具有以下规则,在大多数情况下都可以正常工作,但会从我的 GET 参数中删除句点:

  RewriteRule ^([a-z0-9/-]+)-c-([0-9_]+).html$ index.php [NC,L,QSA]
  RewriteRule ^([a-z0-9/-]+)-m-([0-9]+).html$ index.php [NC,L,QSA]

所以网址是这样的:

http://example.com//index.php?cPath=44_95&page=1&range=1.99_2.99

根据规则重写,1.99_2.99 变为 199_299

如何安全度过经期? (即,不会引起一些随机的副作用)

【问题讨论】:

  • 使用字符类[.]
  • @stribizhev 谢谢,但如何将其添加到我的规则中?我是一个正则表达式的菜鸟......
  • 我认为您的问题与您的模式中未转义的点有关。如果您不确定是否使用 1 个或两个反斜杠,请使用字符类。将.html 替换为[.]html。但是,我不确定这就是您所需要的。
  • 你只需要使用一个反斜杠\.
  • 您的重写与您的示例 URL 不匹配,并且它们没有去除“。”特点。你问错问题了。

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

.htaccess 正则表达式的标准转义字符是斜杠(“\”)。

  RewriteRule ^([a-z0-9/-]+)-c-([0-9_]+)\.html$ index.php [NC,L,QSA]
                                        ^^
  RewriteRule ^([a-z0-9/-]+)-m-([0-9]+)\.html$ index.php [NC,L,QSA]
                                       ^^

斜线将阻止点的含义并将其转义,以便将点逐字作为要匹配的字符(句点,ASCII 码 46 / x2E)。

评论中给出的另一个建议是创建一个仅由点组成的字符类 ("[.]")命名单个字符。但它在技术上是可行的(例如在 escaping dot in Apache mod_rewrite 中已提出建议)。

顺便说一句:Apache rewrite uses Perl Compatible Regular Expression (PCRE) 与 PHP 在 preg_* 系列函数中使用的正则表达式相同,这是 PHP 首选的正则表达式方言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2015-06-06
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多