2013-10-24 7 views
9

/apiのすべてのリクエストをバックエンドのTomcat RESTサービスに渡すためのnginx proxy_passセットアップがあります。このサービスは、Location: http://foo.bar/baz/api/search/1234567などのリクエストの種類によって異なるLocationヘッダーを返します。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

お返事ありがとうございますが、リダイレクト(これはうまくいきます)に興味はありませんが、サーバーの応答として返される「Location」ヘッダーを変更することにあります。 APIは、クライアントが前のクエリの結果を取得すると想定されるURLを含む 'Location'ヘッダを返します。これは、サーバーがプロキシされていることをサーバーが認識していないため、現在は障害のある場所を指しています。 – user2010963

+1

proxy_redirectはLocationヘッダーを変更します...それがその目的です。 nginxのドキュメント(http://wiki.nginx.org/HttpProxyModule#proxy_redirect)を見てください:) –

+1

ああ、私は参照してください!それは確かにそれをやった。ありがとうございました! (私は 'リダイレクト'は実際に何をするのに最適な名前ではないと思うが) – user2010963

関連する問題