我必须在 Web 服务前面放置一个 nginx 反向代理以终止 TLS,该代理仅对 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 仅使用上游服务器相同的位置路径进行回复?
答案1
感谢@Tero Kilkanen,我在 nginx 服务器上执行了 tcpdump,发现上游服务器实际上提供了错误的Location
标头。
在检查了 nginx 发送到上游服务器的每个标头之后,我仍然没有通过 curl 得到相同的答案,最后我找到了罪魁祸首:HTTP 版本!
nginx 默认使用 http/1.0,而 curl 使用 http/1.1,这就是为什么在我之前的测试中从未出现过这种情况。
设置proxy_http_version 1.1;
即可解决问题!