安全地转义 .htaccess mod_rewrite正则表达式中的句点/点 (.) 字符


Safely escape period/dot (.) character in .htaccess mod_rewrite regex

我有一个.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

我怎样才能安全地逃离月经?(即不会引起一些随机副作用(

.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(。

评论中给出的另一个建议是创建一个仅由点(" [.]"(组成的字符类也可以完成这项工作,但是在您只想命名单个字符时创建一个字符类可能有点过分了。但它在技术上是有效的(例如在 Apache mod_rewrite 中的转义点中有人建议(。

顺便说一句:Apache重写使用Perl兼容正则表达式(PCRE(,这与PHP在preg_*系列函数中使用的正则表达式相同,这是PHP首选的正则表达式方言。