nginx 不修改查询,仅重定向反向代理

nginx 不修改查询,仅重定向反向代理

我必须在 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;即可解决问题!

相关内容