17

我有一个 nginxproxy_pass设置,可以将每个请求传递/api到后端 Tomcat REST 服务。在某些情况下,该服务会返回一个Location根据请求类型而变化的标头,例如,Location: http://foo.bar/baz/api/search/1234567baz部分是由于它托管在 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;
}
4

1 回答 1

23

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

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

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

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

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

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

希望这可以帮助!

于 2013-12-01T10:38:43.630 回答