使用nginx proxy_pass修改Location标头

use*_*963 15 regex rewrite header nginx proxypass

我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

Che*_*art 16

您可以使用regexp来修改它,但更好的方法是使用代理重定向:

proxy_redirect http://foo.bar/baz/ /;
Run Code Online (Sandbox Code Playgroud)

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

任何位置标题foo.bar/baz/都将转到/

如果你只是想重定向/baz/api,那也会有效.

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

希望这可以帮助!

  • 感谢您的回复,但我对重定向(工作正常)不太感兴趣,但我对修改作为服务器响应返回的“Location”标头不感兴趣。API 返回一个“Location”标头,其中包含客户端应该从中获取其先前查询结果的 URL。这现在指向一个错误的位置,因为服务器不知道它正在被代理。 (3认同)