nginx proxy_redirect 不重写位置 header 作为响应
nginx proxy_redirect does not rewrite location header in response
我有一个简单的问题
- 使用 nginx 为 6 个上游服务器设置负载均衡器
我已经做到了
upstream hisservers {
ip_hash;
server A;
server B;
server C;
server D;
server E;
server F; }
server {
listen 80;
server_name test.server;
location / {
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;
} }
但问题是...以上解决方案不会重写位置 header 作为响应...所以我总是会重定向到这 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默认会匹配上游并重写位置header..
关于这方面的任何提示..
我认为我的解决方案很老套
您的每个服务器 return 在它们的位置响应中有不同的主机名 headers,因此您的 proxy_redirect
声明必须与这些主机名匹配。
您可以使用单独的 proxy_redirect
语句匹配每个主机名,正如您在问题末尾所展示的那样。
或者,proxy_redirect
允许您使用正则表达式。有关详细信息,请参阅 this document。
例如:
proxy_redirect ~*http://[^/]+(/.*)$ ;
上面的陈述应该可以替代问题末尾的六个陈述。 [^/]+
表达式匹配任何主机名,(/.*)$
表达式捕获要在替换中使用的 URI。
我有一个简单的问题
- 使用 nginx 为 6 个上游服务器设置负载均衡器
我已经做到了
upstream hisservers {
ip_hash;
server A;
server B;
server C;
server D;
server E;
server F; }server {
listen 80;
server_name test.server;
location / {
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;
} }
但问题是...以上解决方案不会重写位置 header 作为响应...所以我总是会重定向到这 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默认会匹配上游并重写位置header..
关于这方面的任何提示..
我认为我的解决方案很老套
您的每个服务器 return 在它们的位置响应中有不同的主机名 headers,因此您的 proxy_redirect
声明必须与这些主机名匹配。
您可以使用单独的 proxy_redirect
语句匹配每个主机名,正如您在问题末尾所展示的那样。
或者,proxy_redirect
允许您使用正则表达式。有关详细信息,请参阅 this document。
例如:
proxy_redirect ~*http://[^/]+(/.*)$ ;
上面的陈述应该可以替代问题末尾的六个陈述。 [^/]+
表达式匹配任何主机名,(/.*)$
表达式捕获要在替换中使用的 URI。