繁体   English   中英

NGINX 位置块正则表达式和代理传递

[英]NGINX location block regex and proxy pass

我希望你们都好。

我是 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
    • (/.*)?$这是我有点困惑的部分
      • 为什么在这种情况下使用()组? 使用 group 的常见用例是什么?
      • 为什么使用? 在这种情况下? .*不是已经包含零个或多个字符,为什么我们还需要?
      • 我们可以简单地删除()? 例如/search/google/.*$以获得与原始行为相同的行为?
  • set $proxy_uri $1$is_args$args;

    • 我知道我们正在设置一个名为proxy_uri的用户定义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相同???

非常感谢您提前!

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

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

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

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

下面会一一解答。

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

这是一个编号的捕获组 与该组匹配的字符串内容稍后可以作为$1引用。 第二个编号的捕获组,出现在正则表达式模式中,可以被引用为$2等等。 还有一个名为捕获组存在,当你可以用它代替你自己的变量名$1$2 ,等一个良好的使用命名捕获组在给出的例子ServerFault线程。

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

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

你注意到我们的捕获组是(/.*) ,而不是(.*)吗? 这样它将匹配/search/google/<any suffix>但不匹配/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相同???

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM