为什么在 Nginx 正则表达式中不需要转义“/”?

Har*_*her 12 nginx regex pcre

所以我终于把学习正则表达式变成了一件事情。通常在使用正则表达式时,需要用“\”转义分隔符(如“/”)。但是当我在 Nginx 中使用正则表达式时,似乎“/”被视为字面意思而不是分隔符。

Nginx 使用 PCRE 引擎来评估正则表达式,所以对我来说,你可以只抛出一个未转义的分隔符而没有任何后果,这对我来说毫无意义。

例如,下面的正则表达式允许单个 IP 地址并拒绝所有其他地址:

location ~ /\.serverfault {
    allow 1.2.3.4;
    deny all;
}
Run Code Online (Sandbox Code Playgroud)

但我认为它需要像这样才能正常工作:

location ~ \/\.serverfault {
    allow 1.2.3.4;
    deny all;
}
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

Mic*_*ton 13

你没有逃跑的原因/是,/不是一个分隔符。

听起来您习惯于在其他需要分隔符的应用程序中编写正则表达式。例如,在 Perl 中,您可能会编写如下内容:

m/\/.serverfault/
Run Code Online (Sandbox Code Playgroud)

这里的关键是您选择了分隔符。没有什么特别之处/。事实上,您几乎可以使用任何字符。#也相当普遍。

m#/.serverfault#
Run Code Online (Sandbox Code Playgroud)

如果您选择特定的分隔符,并且该字符出现在正则表达式中,则必须对其进行转义,或者选择不同的分隔符

因为 nginx 不需要对正则表达式匹配执行替换操作的能力,(例如s/old/new/)它也不需要使用分隔符,因此当你在 nginx 中指定正则表达式时,不使用分隔符,并且(几乎)什么都不需要被逃脱。

  • 我很困惑,因为 https://regex101.com/ 说“/ 未转义的分隔符必须用反斜杠 (\) 转义”,而在搜索词中不转义斜杠。有什么想法吗? (2认同)