【问题标题】:two rules produce the same result in mod_rewrite两条规则在 mod_rewrite 中产生相同的结果
【发布时间】:2014-11-12 09:56:52
【问题描述】:

我使用 127.0.0.1 作为 IP 地址在家用计算机上进行了测试。我用一个规则集做了一些重写规则如下:

RewriteEngine On
RewriteRule ^x\/x$ /letterx [NC,L]
RewriteRule ^y/y$ /lettery [NC,L]

当我进入浏览器并输入 127.0.0.1/x/x 时,我会被重定向到 127.0.0.1/letterx。 当我输入 127.0.0.1/y/y 时,我会被重定向到 127.0.0.1/lettery。

在线查看各种正则表达式来源,没有文章声称 / 是需要转义的字符,但 http://regex101.com/ 声称确实如此。

为什么在这组代码中我尝试重定向成功的两个 url?不应该失败吗? mod_rewrite 中是否有我不知道的错误?根据很多网站,你会认为上面的第二行代码应该失败,而第三行应该可以工作,但我很困惑。

【问题讨论】:

  • @Prix 你对 PCRE 的看法是对的,但 / 不是特殊含义的字符,不需要转义。唯一需要转义的情况是正则表达式分隔符设置为/ ...
  • @hwnd 是的,它不需要转义,因为 mod_rewrite 通过更改默认修饰符或出于安全或任何原因预先转义 / 使用的任何方法。 但是,您回答的措辞不正确,并且对 / 在 PCRE 方面的含义有错误的感觉。
  • 是否有配置文件可用于更改这些正则表达式分隔符?
  • @Mike 不是我所知道的,但您可以放心地假设 / 不需要在 mod_rewrite.htaccess 中转义,在大多数情况下(如果不是全部)它与 @987654331 一起使用@ 或 .htaccess.

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

看起来,regex101 站点默认使用 PCRE 样式的正则表达式,这是 php 使用的,由两个 / 字符分隔。示例:

/thisismyregex/

thisismyregex是由/分隔符包围的正则表达式,如果我想指定正则表达式标志,我在最后一个/之后添加它们:

/thisiscaseinsensitive/i

因为 PCRE 风格的正则表达式使用 / 作为分隔符,如果你想在你的正则表达式中匹配 /你需要转义它

/this\/is\/my\/regex/i

不区分大小写的匹配:this/is/my/regex

但是,mod_rewrite 不使用 PCRE 样式的正则表达式分隔符,因此您无需费心转义 /。在 regex101 站点上的示例,将 regex 样式切换为其他东西,javascript 或 python,您会注意到您突然不再需要转义 / 了。

是否有用于更改这些正则表达式分隔符的配置文件?

没有。不过你可以看看apache documentation for regex

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多