我应该在 Nginx 正则表达式中使用转义字符吗?
Should I use escaped characters in Nginx regular expressions?
proxy_redirect ~*http://127.0.0.1:3000(/.*)$ http://www.example.com;
这是 proxy_redirect
通过将 URL 与正则表达式匹配来修改重定向 URL 的示例,但是其中“/
”和“.
" 字符不添加为转义字符。
我在https://www.nginx.com/blog/regular-expression-tester-nginx/的这篇文章中了解到像“/
”这样的字符可以不用转义符,那么“.
”字符需要转义吗?
也许下面的例子是正确的语法?
proxy_redirect ~*http://127\.0\.0\.1:3000(/.*)$ http://www.example.com;
是的,因为第一个正则表达式模式不会转义点,所以它们用作匹配任何字符(包括点字符本身)的通配符。对于实际用例,它不会导致任何问题,因为它完全匹配 http://127.0.0.1:3000/...
并且您不希望后端输出一些奇怪的输出(至少大部分时间 :))。但是,您的第二个模式在技术上更正确(而且我认为它的性能也稍好一些,因为它使用的通配符较少)。
许多编程语言中常用的斜杠字符作为正则表达式模式 start/stop 定界符,因此大多数在线正则表达式测试人员都希望您默认在模式中转义它。但是 nginx 使用它自己的 ~
(用于 case-sensitive 匹配)或 ~*
(用于 case-insensitive 匹配)模式前缀。在模式本身中,斜杠字符没有任何特殊含义,所以我认为这是一个有目的(且方便)的 nginx 设计解决方案(因为斜杠在现实生活中的 nginx 正则表达式模式中经常出现)。
另一方面,在某些情况下您应该引用 nginx 模式,因为使用了一些在其他情况下很正常的字符,例如大括号(否则将被视为 nginx 控制块定界符)。也就是说,你不能使用
proxy_redirect ~*http://127\.0\.0\.\d{1,3}:3000(/.*)$ http://www.example.com;
line 除非你引用(允许单和 double-qouting)你的正则表达式模式:
proxy_redirect "~*http://127\.0\.0\.\d{1,3}:3000(/.*)$" http://www.example.com;
proxy_redirect ~*http://127.0.0.1:3000(/.*)$ http://www.example.com;
这是 proxy_redirect
通过将 URL 与正则表达式匹配来修改重定向 URL 的示例,但是其中“/
”和“.
" 字符不添加为转义字符。
我在https://www.nginx.com/blog/regular-expression-tester-nginx/的这篇文章中了解到像“/
”这样的字符可以不用转义符,那么“.
”字符需要转义吗?
也许下面的例子是正确的语法?
proxy_redirect ~*http://127\.0\.0\.1:3000(/.*)$ http://www.example.com;
是的,因为第一个正则表达式模式不会转义点,所以它们用作匹配任何字符(包括点字符本身)的通配符。对于实际用例,它不会导致任何问题,因为它完全匹配 http://127.0.0.1:3000/...
并且您不希望后端输出一些奇怪的输出(至少大部分时间 :))。但是,您的第二个模式在技术上更正确(而且我认为它的性能也稍好一些,因为它使用的通配符较少)。
许多编程语言中常用的斜杠字符作为正则表达式模式 start/stop 定界符,因此大多数在线正则表达式测试人员都希望您默认在模式中转义它。但是 nginx 使用它自己的 ~
(用于 case-sensitive 匹配)或 ~*
(用于 case-insensitive 匹配)模式前缀。在模式本身中,斜杠字符没有任何特殊含义,所以我认为这是一个有目的(且方便)的 nginx 设计解决方案(因为斜杠在现实生活中的 nginx 正则表达式模式中经常出现)。
另一方面,在某些情况下您应该引用 nginx 模式,因为使用了一些在其他情况下很正常的字符,例如大括号(否则将被视为 nginx 控制块定界符)。也就是说,你不能使用
proxy_redirect ~*http://127\.0\.0\.\d{1,3}:3000(/.*)$ http://www.example.com;
line 除非你引用(允许单和 double-qouting)你的正则表达式模式:
proxy_redirect "~*http://127\.0\.0\.\d{1,3}:3000(/.*)$" http://www.example.com;