web-dev-qa-db-ja.com

proxy_passを使用しているときにnginxに応答ヘッダーを追加する方法は?

Nginxの背後にあるサーバーから受信した応答にカスタムヘッダーを追加したい。

add_headerはnginxで処理された応答に対して機能しますが、proxy_passが使用されている場合は何もしません。

74
sorin

HttpHeadersMoreModule というモジュールがあり、ヘッダーをより詳細に制御できます。 Nginxには付属していないため、追加のインストールが必要です。これを使用すると、次のようなことができます。

location ... {
  more_set_headers "Server: my_server";
}

これにより、「サーバーの出力ヘッダーが、ステータスコードとコンテンツタイプのカスタム値に設定されます」。すでに設定されているヘッダーを置き換えるか、設定されていない場合は追加します。

23

add_headerは、proxy_passを使用しても同様に機能します。私は今日、まさにそのディレクティブを使用した構成をセットアップしました。ただし、理由を正確に思い出せずにこれを設定するのに苦労したことも認めなければなりません。

現在、私は動作する構成を持っていますが、それには(とりわけ)次が含まれています:

server {
    server_name  .myserver.com
    location / {
        proxy_pass  http://mybackend;
        add_header  X-Upstream  $upstream_addr;
    }
}

Nginxの前に1.7.5add_headerHttpHeadersMoreModuleSebastian Goodmanの答え とは対照的に、成功した応答に対してのみ機能しました。

Nginx 1.7.5から、キーワードalwaysを使用して、エラー応答にカスタムヘッダーを含めることができます。例えば:

add_header X-Upstream $upstream_addr always;

制限:add_headerを使用してserverヘッダー値を上書きすることはできません。

140
Oliver

オリバーが書いているように:

add_headerは、proxy_passを使用しても同様に機能します。

ただし、シェーンが書いているように、Nginx 1.7.5の時点で、alwaysを渡してエラー応答に対してadd_headerを機能させる必要があります。

add_header  X-Upstream  $upstream_addr always;
23

この解決策を試すことができます:

proxy_passを使用する場合は、locationブロックで次のようにします。

location ... {

  add_header yourHeaderName yourValue;
  proxy_pass xxxx://xxx_my_proxy_addr_xxx;

  # Now use this solution:
  proxy_ignore_headers yourHeaderName // but set by proxy

  # Or if above didn't work maybe this:
  proxy_hide_header yourHeaderName // but set by proxy

}

私はそれがあなたが必要とするものであるかどうか確かではありませんが、この方法のいくつかの操作を試してみて、おそらく結果があなたの問題に合うでしょう。

また、次の組み合わせを使用できます。

proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;
12
emka86

応答ヘッダーを非表示にしてから、新しいカスタムヘッダー値を追加します

add_headerを使用してヘッダーを追加すると、プロキシパスで正常に機能しますが、応答に既存のヘッダー値がある場合、値がスタックされます。

ヘッダー値を設定または置換する場合(たとえば、_Originリソース共有を許可するためにAccess-Control-Allow-Originヘッダーをクライアントに合わせて置換する)、次のようにできます。

# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;

proxy_hide_headeradd_headerを組み合わせることで、応答ヘッダー値を設定/置換することができます。

同様の答えを見つけることができます ここではServerFault

3
Wilt