nginx proxy_redirect 不会在响应中重写位置标头

Posted

技术标签:

【中文标题】nginx proxy_redirect 不会在响应中重写位置标头【英文标题】:Nginx proxy_redirect does not rewrite location header in response 【发布时间】:2022-01-14 01:11:57 【问题描述】:

我有一个简单的问题

使用 nginx 为 6 个上游服务器设置负载平衡器

我已经这样做了

上游他的服务器 ip_hash; 服务器 A; 服务器 B; 服务器 C; 服务器 D; 服务器 E; 服务器 F;

服务器 听 80; server_name test.server; 位置 / proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://hisservers;

但问题是......上面的解决方案没有重写 Location 头响应......所以我总是重定向到这 6 个上游中的任何一个

然后我就这样做了

proxy_redirect http://hisservers /;

还是不行 最后我做到了

proxy_redirect http://A/ /; proxy_redirect http://B/ /; proxy_redirect http://C/ /; proxy_redirect http://D/ /; proxy_redirect http://E/ /; proxy_redirect http://F//;

它有效..

我认为默认情况下 nginx 会匹配上游并重写位置标头..

关于这个的任何提示..

我认为我的解决方案很老套

【问题讨论】:

【参考方案1】:

您的每台服务器在其 Location 响应标头中返回不同的主机名,因此您的 proxy_redirect 语句必须与这些主机名匹配。

您可以使用单独的 proxy_redirect 语句匹配每个主机名,正如您在问题末尾所演示的那样。

另外,proxy_redirect 允许您使用正则表达式。详情请见this document。

例如:

proxy_redirect ~*http://[^/]+(/.*)$ $1;

上述陈述应替代问题末尾的六个陈述。 [^/]+ 表达式匹配任何主机名,(/.*)$ 表达式捕获要在替换中使用的 URI。

【讨论】:

太棒了!谢谢你的反馈.. 我虽然 nginx 会自动处理重写头

以上是关于nginx proxy_redirect 不会在响应中重写位置标头的主要内容,如果未能解决你的问题,请参考以下文章

nginx中的proxy_redirect的使用

nginx proxy_redirect指令功能

06 nginx 处理转发其他域的处理 以及 proxy_redirect

06 nginx 处理转发其他域的处理 以及 proxy_redirect

06 nginx 处理转发其他域的处理 以及 proxy_redirect

nginx 反向代理之 proxy_redirect