我有一个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;
}
答案 0 :(得分:15)
您可以使用regexp来修改它,但更好的方法是使用代理重定向:
proxy_redirect http://foo.bar/baz/ /;
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
foo.bar/baz/
的任何位置标头都将转到/
如果您只想重定向/baz/api
,那也可以。
如果有任何重定向也在添加端口,您还需要添加http://foo.bar:8080/baz/
(单独重定向)。
希望这有帮助!