Nginxの背後にあるサーバーから受信した応答にカスタムヘッダーを追加したい。
add_header
はnginxで処理された応答に対して機能しますが、proxy_pass
が使用されている場合は何もしません。
HttpHeadersMoreModule というモジュールがあり、ヘッダーをより詳細に制御できます。 Nginxには付属していないため、追加のインストールが必要です。これを使用すると、次のようなことができます。
location ... {
more_set_headers "Server: my_server";
}
これにより、「サーバーの出力ヘッダーが、ステータスコードとコンテンツタイプのカスタム値に設定されます」。すでに設定されているヘッダーを置き換えるか、設定されていない場合は追加します。
add_header
は、proxy_pass
を使用しても同様に機能します。私は今日、まさにそのディレクティブを使用した構成をセットアップしました。ただし、理由を正確に思い出せずにこれを設定するのに苦労したことも認めなければなりません。
現在、私は動作する構成を持っていますが、それには(とりわけ)次が含まれています:
server {
server_name .myserver.com
location / {
proxy_pass http://mybackend;
add_header X-Upstream $upstream_addr;
}
}
Nginxの前に1.7.5
add_headerHttpHeadersMoreModuleSebastian Goodmanの答え とは対照的に、成功した応答に対してのみ機能しました。
Nginx 1.7.5
から、キーワードalways
を使用して、エラー応答にカスタムヘッダーを含めることができます。例えば:
add_header X-Upstream $upstream_addr always;
制限:add_header
を使用してserver
ヘッダー値を上書きすることはできません。
オリバーが書いているように:
add_header
は、proxy_pass
を使用しても同様に機能します。
ただし、シェーンが書いているように、Nginx 1.7.5の時点で、always
を渡してエラー応答に対してadd_header
を機能させる必要があります。
add_header X-Upstream $upstream_addr always;
この解決策を試すことができます:
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;
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_header
とadd_header
を組み合わせることで、応答ヘッダー値を設定/置換することができます。
同様の答えを見つけることができます ここではServerFault