96

リバースプロキシとしてnginxを使用していて、アップストリームサーバー(Apache)の応答からカスタムヘッダーを読み取ろうとしていますが、成功しません。Apacheの応答は次のとおりです。

HTTP/1.0 200 OK
Date: Fri, 14 Sep 2012 20:18:29 GMT 
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.10
Connection: close
Content-Type: application/json; charset=UTF-8
My-custom-header: 1

My-custom-headerから値を読み取り、それをif句で使用したいと思います。

location / {
    // ...
    // get My-custom-header value here
    // ...
}

これは可能ですか?前もって感謝します。

4

4 に答える 4

108

それは可能であるだけでなく、簡単です。

nginxでは、応答ヘッダー値は変数(ヘッダーごとに1つ)を介して利用できます。これらの変数の詳細については、http://wiki.nginx.org/HttpCoreModule#.24sent_http_HEADERを参照してください。

たとえば、変数は$sent_http_My_custom_headerになります。

于 2012-09-14T20:43:05.683 に答える
60

私は同じ問題に直面していました。私は両方を試しまし$http_my_custom_header$sent_http_my_custom_headerが、うまくいきませんでした。

を使用してこの問題を解決しましたが$upstream_http_my_custom_header

于 2015-06-16T22:14:45.743 に答える
20

NGINXをプロキシとして使用する場合、ヘッダーには次の4つのセットがあります。

  • client -> nginx:クライアントリクエストヘッダー
  • nginx -> upstream:アップストリームリクエストヘッダー
  • upstream -> nginx:アップストリーム応答ヘッダー
  • nginx -> client:クライアント応答ヘッダー

アップストリームの応答ヘッダーについて質問しているようです。それらは変数にあります。$upstream_http_name

ただし、応答ヘッダーは、アップストリームサーバーの応答からのヘッダーが受信された後にのみ設定されることを考慮に入れてください。ディレクティブはifアップストリームリクエストを送信する前に実行され、レスポンスヘッダーにはアクセスできません。つまり、ifディレクティブは、クライアント要求が受信された後、アップストリーム要求を行う前に実行されます。

応答の処理方法を変更する必要がある場合は、mapディレクティブを使用して応答ヘッダーに基づいて変数を設定し、それらの変数をadd_header(クライアント応答ヘッダーの設定)でlog_format使用するか、応答フェーズ中にアクティブになるその他のディレクティブ(内部で)を使用できます。NGX_HTTP_CONTENT_PHASEおよびNGX_HTTP_LOG_PHASEフェーズという名前)。より複雑な制御を行うには、 Luaモジュールなどのスクリプトアドオンを使用する必要があります(header_filter_by_lua_blockディレクティブの使用など)。

個々のヘッダーを読み取ったり設定したりするには、次を使用します。

から タイプ 読み取り(変数) 書き込み(ディレクティブ)
クライアント nginx リクエスト $http_name – </ td>
ngnix 上流の リクエスト – </ td> proxy_set_header
上流の nginx 応答 $upstream_http_name – </ td>
nginx クライアント 応答 $sent_http_name add_header

proxy_NGINXは、さまざまなディレクティブを使用して、クライアントリクエストからアップストリームリクエストに、およびアップストリームレスポンスからクライアントレスポンスに特定のヘッダーをコピーし、いずれかの方向のヘッダーを省略または明示的に含めるオプションを提供します。したがって、アップストリーム応答ヘッダーが変数にのみ含まれている場合、それらのヘッダーは特にクライアント応答にコピーされません。使用可能な変数のセットには、アップストリーム応答に存在しないNGINXによって設定された追加のヘッダーが含まれます。$upstream_http_name$sent_http_name

于 2021-10-12T12:17:30.860 に答える
11

$http_MY_CUSTOM_HEADERを使用します

あなたは何かを書くことができます-のようなもの

set my_header $http_MY_CUSTOM_HEADER;
if($my_header != 'some-value') {
#do some thing;
}
于 2014-05-12T06:25:52.480 に答える