我必须在 TLS 终止的 Web 服务前面放置一个 nginx 反向代理,它只使用 URI 的查询部分进行 302 重定向:
GET /path/to/document?query=1
Host: 127.0.0.1
Returns 302 with
Location: ?query=2
nginx 总是构建完整的 URI 但忽略文档,因此重定向不起作用
GET /path/to/document?query=1
Host: example.com
Returns 302 with
Location: https://example.com/path/to/?query=2
我试过了proxy_redirect off;
,但这并没有改变任何东西。我究竟做错了什么?
这是我目前使用的配置:
location / {
client_max_body_size 50M;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_pass http://ip.of.the.host/;
proxy_redirect off;
}
我可以设置proxy_redirect ~\?(.*)$ https://example.com/path/to/document?$1;
,但我确定我会破坏其他东西。
如何让 nginx 只回复与上游服务器相同的位置路径?
感谢@Tero Kilkanen,我在 nginx 服务器上做了一个 tcpdump,发现上游服务器实际上提供了错误的
Location
标头。在浏览了发送到上游服务器的每个标头 nginx 之后,我仍然没有通过 curl 得到相同的答案,我终于找到了罪魁祸首:HTTP 版本!
默认情况下,nginx 使用 http/1.0,而 curl 使用 http/1.1,这就是为什么在我之前的测试中这从未出现过。
设置
proxy_http_version 1.1;
解决问题!