2013-10-24 80 views
9

我有一个nginx proxy_pass安装程序将/api上的每个请求传递给后端Tomcat REST服务。在某些情况下,此服务会返回一个Location标题,该标题根据请求类型而不同,例如Location: http://foo.bar/baz/api/search/1234567 - baz部分归因于其托管在Tomcat上。使用nginx proxy_pass修改位置标题

我当前的配置正确地重写了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; 
} 

回答

11

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

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/(单独重定向)。

希望这会有所帮助!

+1

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

+1

proxy_redirect修改位置标题......这是它的目的。看看nginx文档(http://wiki.nginx.org/HttpProxyModule#proxy_redirect):) –

+1

哦,我明白了!那确实做到了。谢谢! (尽管我确实认为'重定向'并不是它实际做的最好的名字) – user2010963