ホームページ  >  記事  >  運用・保守  >  nginx設定add_headerの落とし穴を解決する方法

nginx設定add_headerの落とし穴を解決する方法

王林
王林転載
2023-05-17 17:40:061816ブラウズ

前書き

add_header は headers モジュールで定義されている命令で、その名前が示すように http レスポンス ヘッダーを追加するために使用されます。ただし、これは単に「追加」するだけであり、書き換えではないことに注意してください。したがって、ヘッダーがすでに存在する場合、add_header を使用すると問題が発生します。さらに、nginx の以前のバージョンでは、add_header はエラー ページでの使用をサポートしていません。

これは多くの落とし穴のある指示です。処理段階はロケーション処理よりも後であり、ロケーション内に書き込むことはできますが、別のロケーションを書き換えると、前のロケーションにある未処理の add_header が失われます。例:

location = /a {
 add_header a 1;
 rewrite / /b;
}
location = /b {
 add_header b 2;
 return 204;
}

nginx設定add_headerの落とし穴を解決する方法

にはヘッダー 1 がありませんね。ここは穴だ!

もう 1 つの落とし穴は、冒頭で述べた反復的な問題です。たとえば、コンテンツに content-type を設定したいのですが、グローバルに設定されている default_type があるため、それが繰り返されてしまいます。

default_type 'text/plain';

location = /a {
 add_header content-type application/json;
 return 200 '"ok"';
}

nginx設定add_headerの落とし穴を解決する方法

もちろん、この場所のdefault_typeを空白のままにするか、単純にadd_headerを使用せずにこの場所のdefault_typeを直接変更するなど、多くの解決策があります。

最後の大きな落とし穴は、エラー ページでは有効にできないことです。これも で明確に定義されています。たとえば、次の例:

location = /a {
 add_header content-type application/json;
 return 404 '"not found"';
}

json で応答したいのですが、ステータス コードが 404 であるため、ここでの add_header は有効になりません。

nginx設定add_headerの落とし穴を解決する方法

この例では、default_type を使用して問題を解決できますが、他のヘッダーの場合はどうなるでしょうか?たとえば、access-control-allow-origin はどうすればよいでしょうか?その場合、lua またはその他のサードパーティ モジュールを使用して解決する以外に解決策はありません。もちろん、nginx もこの問題を認識しているため、バージョン 1.7.5 以降は always と呼ばれるパラメータをサポートするとドキュメントにも記載されています。 nginx はこの問題を独自に解決しましたが、1.6.2 ベースの tengine は失敗しようとしています。

以上がnginx設定add_headerの落とし穴を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。