121

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

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

4

5 に答える 5

202

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_headerは成功した応答でのみ機能していましたが、 SebastianGoodmanが彼の回答で言及したHttpHeadersMoreModuleとは対照的です。

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

add_header X-Upstream $upstream_addr always;

制限:serverを使用してヘッダー値をオーバーライドすることはできませんadd_header

于 2013-04-30T21:07:31.310 に答える
37

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

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

ヘッダー値を設定または置換する場合(たとえば、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で見つけることができます

アップデート:

注: proxy_set_headerこれは、要求がさらに送信される前に要求ヘッダーを設定するためのものであり、応答ヘッダーを設定するためのものではありません(ヘッダーのこれらの構成属性は少し混乱する可能性があります)。

于 2019-04-15T15:17:58.300 に答える
36

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

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

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

于 2013-01-24T18:22:08.970 に答える
33

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

add_header使用しても使用しない場合も同様に機能しproxy_passます。

ただし、Shaneが書いているように、Nginx 1.7.5の時点では、次のようにエラー応答を処理alwaysするために合格する必要があります。add_header

add_header  X-Upstream  $upstream_addr always;
于 2016-05-31T19:33:11.470 に答える
17

あなたはこの解決策を試すことができます:

あなたlocationが使用するときあなたのブロックproxy_passでこのようなことをしてください:

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;
于 2013-01-24T17:31:25.010 に答える