【问题标题】:NGINX location block regex and proxy passNGINX 位置块正则表达式和代理通行证
【发布时间】:2021-11-26 15:41:23
【问题描述】:

希望你们一切都好。

我是 NGINX 的初学者,我正在尝试理解以下 NGINX 配置文件块。如果有人能帮助我理解这个块,我将不胜感激。

location ~ ^/search/google(/.*)?$ {
  set $proxy_uri $1$is_args$args;
  proxy_pass http://google.com$proxy_uri;
}

从以下 SO 文章 (https://stackoverflow.com/a/59846239) 中,我了解到:

  • 对于location ~ ^/search/google(/.*)?$

    • ~ 表示它将执行正则表达式搜索(区分大小写)
    • ^/search/google 表示路由应该以/search/google 开头(例如http://<ip or domain>/search/google。如果我们在末尾有尾随/ 有什么区别(例如http://<ip or domain>/search/google/ 而不是http://<ip or domain>/search/google
    • (/.*)?$ 这是我有点困惑的部分
      • 为什么在这种情况下使用() 组?使用组的常见用例是什么?
      • 为什么在这种情况下使用?.* 不是已经包含零个或多个字符,为什么我们还需要 ?
      • 我们可以简单地删除()?(例如/search/google/.*$)以获得与原始行为相同的行为吗?
  • set $proxy_uri $1$is_args$args;

    • 我知道我们正在设置一个名为proxy_uri 的用户定义变量
    • $1 会被替换成什么,有时有人还包括$2 等等?
    • 我认为$is_args$args的意思是如果有查询字符串(即http://<ip or domain>/search/google?fruit=apple$is_args$args会被替换为?fruit=apple
  • proxy_pass http://google.com$proxy_uri

    • 我会假设它只是将用户重定向到http://google.com$proxy_uri???和http重定向301一样???

非常感谢您!

【问题讨论】:

    标签: regex nginx proxypass


    【解决方案1】:

    作为一个非英语母语的人,我认为有人会用比我更完美的英语回答你的问题,但由于过去五天没有人这样做,我会尝试自己做。

    ~ 表示它将执行正则表达式搜索(区分大小写)

    我认为更正确的术语是“对正则表达式进行匹配”。

    ^/search/google 表示路由应该以/search/google 开头(例如http://<ip or domain>/search/google。如果我们在末尾有尾随/ 有什么区别(例如http://<ip or domain>/search/google/ 而不是http://<ip or domain>/search/google

    下面会回答。

    为什么在这种情况下使用() 组?使用组的常见用例是什么?

    这是numbered capturing group。与该组匹配的字符串内容稍后可以引用为$1。第二个编号的捕获组,出现在正则表达式模式中,可以引用为$2 等等。还有named capture groups 存在,当您可以使用自己的变量名来代替$1$2 等时。this ServerFault 线程给出了使用命名捕获组的一个很好的例子。

    顺便说一句,您引用的answer 提到了编号的捕获组(但不是命名的捕获组)。

    为什么在这种情况下使用?.* 不是已经包含零个或多个字符了吗,为什么我们还需要?

    您是否注意到我们的捕获组是(/.*),而不是(.*)?这样,它将匹配 /search/google/<any suffix> 但不匹配 /search/googles 等。问号使此捕获组可选(/search/google 也将匹配我们的正则表达式模式)。

    我们可以简单地删除()?,例如/search/google/.*$ 以获得与原始行为相同的行为吗?

    不,因为我们稍后需要 $1 值。如果您正确理解以上所有信息,您应该会看到它可以是/<any suffix> 或空字符串。

    $1会被替换成什么,有的时候还包括$2等等?

    已经回答了。

    我认为$is_args$args表示如果有查询字符串(即http://<ip or domain>/search/google?fruit=apple$is_args$args将被替换为?fruit=apple

    是的,没错。

    我会假设它只是将用户重定向到http://google.com$proxy_uri???和http重定向301一样???

    完全错误。 here 简要描述了差异,尽管该答案没有提到您可以在将响应发送到客户端之前额外修改响应(例如,使用 sub_filter 模块)。

    【讨论】:

    • 非常感谢@Ivan Shatsky 的简洁明了的解释!顺便说一句,您的英语非常好,而且我自己来自非英语母语人士,我认为只要其他人理解您试图通过您的信息传达的内容,就可以完成工作!再次感谢您抽出宝贵时间帮助他人,gbu!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多