首页 > 解决方案 > NGINX 位置块正则表达式和代理通行证

问题描述

我希望你们都很好。

我是 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)中,我了解到:

非常感谢您!

标签: regexnginxproxypass

解决方案


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

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

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

^/search/google意味着路线应该以/search/google(例如http://<ip or domain>/search/google。如果我们在末尾有尾随/(例如http://<ip or domain>/search/google/,而不是http://<ip or domain>/search/google

下面会一一解答。

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

这是一个编号的捕获组。与该组匹配的字符串的内容稍后可以引用为$1. 第二个编号的捕获组,存在于正则表达式模式中,可以引用为$2,依此类推。当您可以使用自己的变量名而不是 , 等时,还存在命名捕获组。在ServerFault 线程中给出了使用命名捕获组的一个很好的示例。$1$2

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

为什么?在这种情况下使用?还没有.*包含零个或更多的字符,为什么我们还需要?

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

我们可以简单地删除()and?/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


推荐阅读