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 不会在响应中重写位置标头的主要内容,如果未能解决你的问题,请参考以下文章
06 nginx 处理转发其他域的处理 以及 proxy_redirect
06 nginx 处理转发其他域的处理 以及 proxy_redirect