Nginx的location正则表达式中,需要对斜线进行转义吗?

10
Nginx使用PCRE引擎来评估正则表达式,文档说明不使用/分隔符,因此我们不必像在标准正则表达式中那样转义URI中的斜杠/。一个有效的nginx正则表达式示例是location ~* /myapp/.+\.php$。但是以下代码转义了斜杠:location ~ ^\/(?:index|core\/ajax\/update|ocs\/v2|ocm-provider\/.+)\.php(?:$|\/)。在这种情况下,\/表示什么,为什么需要它,而文档又说不需要呢?

3
没问题,你不需要转义它,但也不是不能转义。这和选择写\a\j\a\x代替ajax没有什么区别,虽然可读性较差,但功能相同。语法是自我解释的,因为它翻译成“字面正斜杠”,但使用它的原因可能是作者习惯了,或者只是为了在复制和粘贴时使正则表达式更加便携。 - MonkeyZeus
@MonkeyZeus 感谢您的澄清,有时候我会在匹配组的情况下认为这是必需的。 - intika
1
不客气。阅读他人正则表达式的最大挑战之一是解密意图。随着正则表达式可视化工具(如https://regex101.com/)的出现,解密语法功能变得越来越容易。 - MonkeyZeus
1个回答

6
尽管Nginx不需要转义正斜杠 /,但它也不会像转义其他字符一样拒绝对其进行转义。正则表达式特殊字符 \ 的第一个目的是用于转义下一个字符,因此nginx只是将 \/ 翻译/匹配为 /,就像它将 \j 翻译/匹配为字面上的 j (例如\j 匹配字面上的 j, 尽管此示例没有任何用途)。
在nginx上转义正斜杠的一个目的可能是为了代码可移植性。
请注意,跟随 \ 的字符可能具有不同的含义,完整列表可在这里获得 来源:@monkeyzeus和@richard-smith评论

3
不起作用。在正则表达式中,“\a”和“\x”具有特定的含义。“\j”和“/”都是安全的,分别代表“j”和“/”。 - Richard Smith
@RichardSmith 非常感谢,我确实忘记了那个...我已经编辑了答案。 - intika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接