proxy_passを使用するときにnginxに応答ヘッダーを追加するにはどうすればよいですか?


90

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

一方でadd_header時にnginxの処理応答のための作品、それは何もしませんproxy_pass使用されています。


したがって、リクエストをプロキシとそのプロキシセットのレスポンスに渡し、このレスポンスでカスタムヘッダーを追加してから、ユーザーに送信されるようにします。
emka86 2013年

回答:


29

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

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

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


それは、追加することが可能であるSecureHttpOnlyフラグに応答クッキー?ただし、ターゲット応答CookieにはCookie と属性のみが含まれます。nameexpire
JPaulPunzalan 2017年

2
応答ヘッダーを変更または追加できるようにするためにライブラリは必ずしも必要ではありません。最も投票された回答とは異なり、ヘッダーをオーバーライドできます。最初にそれを削除するだけです。詳細については、以下の私の答えを確認しください。
ウィルト

155

add_header でも動作します proxy_passなし。今日、まさにそのディレクティブを使用した構成をセットアップしました。しかし、理由を正確に思い出すことなくこれを設定するのに苦労したことは認めざるを得ません。

現在、私は動作する設定をしており、それは(とりわけ)以下を含みます:

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

nginx以前は、セバスチャングッドマンが彼の回答で述べたHttpHeadersMoreModuleとは対照的に、1.7.5 add_headerは成功した応答のみに取り組みました

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

add_header X-Upstream $upstream_addr always;

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


40
nginxの1.7.5以来、あなたははadd_headerを使用してエラー応答でカスタムヘッダーを含めるように「常に」を使用することができますadd_header X-Upstream $upstream_addr always;
シェーン

とにかく、プロキシされたサーバーのIP /ポートの組み合わせを公開せずに同様の機能を使用しますか?たとえばX-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5はおそらくインフラストラクチャのマスキングには役立ちませんが、アイデアを伝えます)。
zamnuts 2015年

@zamnuts:アップストリームIPとポート番号を渡すことは、add_headerディレクティブの使用例にすぎません。それらを送信する必要はありません
オリバー

@Oliver、私はそれを知っていますが、IP /ポート番号以外の代替の個人/一意のアップストリーム識別子、またはその難読化について問い合わせていました。おそらく私の質問は範囲外であり、私は新しい投稿を作成する必要があります:)
zamnuts

@zamnuts:新しい質問をすることもお勧めします:-)
Oliver

25

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

add_headerproxy_passなしでも動作します。

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

add_header  X-Upstream  $upstream_addr always;

5
なぜヘッダーが表示されないのか疑問に思い、サーバーブロック、ロケーションブロックなどにヘッダーを移動しようとしましたが、その理由は次の
とおりです。nginxが

私も:)そして、この答えにもかかわらず、これは先日再び私に起こりました。私自身の答えを確認する必要がありました。
ドミトリーミンコフスキー


14

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

あなたの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;

6
nginxは既存のヘッダーを上書きするのではなく、重複したヘッダーを追加していたため、この方法を使用する必要がありました。location / { proxy_pass http://127.0.0.1:8080/; proxy_hide_header "Access-Control-Allow-Origin"; if ($http_origin ~* "^https://(example.com|www.example.com)$") { add_header Access-Control-Allow-Origin "$http_origin"; } }
ether6

11

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

ヘッダーの追加は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は、リクエストがさらに送信される前にリクエストヘッダーを設定するためのものであり、レスポンスヘッダーを設定するためのものではありません(これらのヘッダーの構成属性は少しわかりにくい場合があります)。


おかげで、大きな助け
Lancer.Yan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.