所以我决定最终学习正则表达式。通常,使用正则表达式时,需要用“\”转义分隔符(如“/”)。但是当我在 Nginx 中使用正则表达式时,似乎“/”被按字面意义处理,而不是作为分隔符。
Nginx 使用 PCRE 引擎来评估正则表达式,因此对我来说,直接插入未转义的分隔符而不产生任何后果是没有意义的。
举例来说,以下正则表达式允许单个 IP 地址并拒绝所有其他 IP 地址:
location ~ /\.serverfault {
allow 1.2.3.4;
deny all;
}
但我认为它需要像这样才能正常工作:
location ~ \/\.serverfault {
allow 1.2.3.4;
deny all;
}
我在这里遗漏了什么?
答案1
你不必逃跑的原因/
是/
不是分隔符。
听起来您习惯于在其他应用程序中编写正则表达式,在这些应用程序中需要使用分隔符。例如,在 Perl 中,您可能会编写如下内容:
m/\/.serverfault/
关键在于你选择了分隔符。 没有什么特别的/
。事实上,您可以使用几乎任何字符。#
也相当常见。
m#/.serverfault#
如果你选择特定的分隔符,并且该字符出现在正则表达式中,则必须对其进行转义,或选择不同的分隔符。
因为 nginx 不需要对正则表达式匹配执行替换操作的能力,(例如s/old/new/
)它也不需要使用分隔符,因此当您在 nginx 中指定正则表达式时,不使用分隔符,并且(几乎)不需要转义任何内容。