使用 nginx proxy_pass 修改 Location 标头

Posted

技术标签:

【中文标题】使用 nginx proxy_pass 修改 Location 标头【英文标题】:Modifying a Location header with nginx proxy_pass 【发布时间】:2013-11-03 07:25:13 【问题描述】:

我有一个 nginx proxy_pass 设置将/api 上的每个请求传递到后端 Tomcat REST 服务。在某些情况下,此服务会返回一个 Location 标头,该标头会根据请求的类型而有所不同,例如 Location: http://foo.bar/baz/api/search/1234567 -- baz 部分是因为它托管在 Tomcat 上。

我当前的配置正确地重写了foo.bar 主机名,但保持baz 部分完好无损。我想去掉这个,但 proxy_pass 选项似乎仅限于清除或设置标题的新值。

有没有办法在传递给客户端之前动态修改标头,例如使用正则表达式替代?这是我的 nginx 配置:

location /api 
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_max_temp_file_size 0;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffers           32 4k;
    proxy_redirect off;

    proxy_pass http://foo.bar:8080/baz/api;

【问题讨论】:

【参考方案1】:

您也许可以使用正则表达式来修改它,但更好的方法是使用代理重定向:

proxy_redirect http://foo.bar/baz/ /;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

foo.bar/baz/ 的任何 Location 标头都将转到 /

如果你只是想重定向/baz/api,那也可以。

如果任何重定向也添加了端口,您还需要添加 http://foo.bar:8080/baz/(单独重定向)。

希望这会有所帮助!

【讨论】:

感谢您的回复,但我对重定向(工作正常)不太感兴趣,而是修改作为服务器响应返回的 Location 标头。 API 返回一个 Location 标头,其中包含客户端应该获取其先前查询结果的 URL。这现在指向一个错误的位置,因为服务器不知道它正在被代理。 proxy_redirect 修改 Location 标头...这就是它的目的。看看 nginx 文档 (wiki.nginx.org/HttpProxyModule#proxy_redirect) :) 哦,我明白了!那确实做到了。谢谢! (虽然我确实认为 redirect 并不是它实际功能的最佳名称) 同意!我认为 proxy_rewrite 或类似的东西会更有意义哈哈 @ChelseaUrquhart 如何只修改 URL 的某些部分而不是整个 URL?

以上是关于使用 nginx proxy_pass 修改 Location 标头的主要内容,如果未能解决你的问题,请参考以下文章

使用 nginx proxy_pass 修改 Location 标头

Nginx下的location,upstream,rewrite 和 proxy_pass使用总计大全

如何使用 nginx proxy_pass 保留请求 url

nginx使用proxy_pass反向代理时cookie丢失问题解决方案

nginx proxy_pass转发header丢失

nginx proxy_pass转发header丢失