Nginx の add_header ディレクティブに注意する必要があるのはなぜですか?

Nginx の add_header ディレクティブに注意する必要があるのはなぜですか?

序文

ご存知のとおり、nginx 構成ファイルは add_header ディレクティブを使用して応答ヘッダーを設定します。

昨日、退屈だったので curl を使用してサイトの情報を確認したところ、返されたヘッダーが予想と異なることがわかりました。

HTTP/2 200
日付: 2019年2月7日(木)04:26:38 GMT
コンテンツタイプ: text/html; 文字セット=UTF-8
変化: Accept-Encoding、Cookie
キャッシュ制御: max-age=3、再検証が必要
最終更新日: 2019年2月7日(木) 03:54:54 GMT
X-Cache: ミス
サーバー: cloudflare
...

メイン サイトでは、nginx.conf で HSTS とその他のヘッダーを構成します。

add_header Strict-Transport-Security "max-age=63072000; プリロード";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

しかし、応答ヘッダーにはこれらのヘッダーがありません。通常のヘッダーに加えて、場所にはヘッダー X-Cache が 1 つだけ構成されています。

第一印象は、CDN がこれらのヘッダーをフィルタリングしているということですか?そこで、Cloudflare のドキュメントを探しましたが、これらの処理方法に関するドキュメントは見つかりませんでした。よく考えてみると、CDN はなぜこれらをフィルタリングするのでしょうか?食べ過ぎて飽きていませんか?彼らは政治的な調査は行いません!

問題は Nginx の設定に移ります。 Google を開いて「nginx location add_header」を検索したところ、確かにかなりの数の欠陥が見つかりました。公式サイトのadd_headerドキュメントをクリックすると、次のような説明があります(他の情報は省略されています)。

add_header ディレクティブは複数存在する可能性があります。これらのディレクティブは、現在のレベルで add_header ディレクティブが定義されていない場合にのみ、前のレベルから継承されます。

「これらのディレクティブは、現在のレベルで add_header ディレクティブが定義されていない場合にのみ、前のレベルから継承されます。」という強調に注意してください。つまり、現在のレベルに add_header ディレクティブがない場合にのみ、親設定が継承されます。したがって、私の質問は明確です。location に add_header があり、nginx.conf の設定は破棄されます。

これは Nginx の意図的な動作であり、バグや落とし穴とは言えません。しかし、この文を詳しく見てみると、もっと興味深い現象が見つかります。最新の add_header だけが機能するのです。 add_header は http、server、location で設定できますが、最も近い設定が有効になり、上記の設定は無効になります。

しかし、問題はそれだけでは終わらない。場所が別の場所に書き換えられると、最終結果には 2 番目のヘッダーのみが表示されます。例えば:

場所 /foo1 {
 ヘッダーを追加します。
 //foo2 を書き換えます。
}

場所 /foo2 {
 ヘッダーを追加します。
 200「OK」を返します。
}

リクエストが /foo1 であるか /foo2 であるかに関係なく、最終ヘッダーは foo2 のみになります。

これは理にかなっており、正常な動作ですが、少し強制的で不快な感じがします。サーバーが http 構成を失い、場所がサーバー構成を失うのは問題ありませんが、2 つの場所は同じレベルにあります。

親構成を継承できず、現在のブロック内の命令を繰り返したくない場合は、include 命令を使用することが解決策です。

参照する

  • Nginx モジュール ngx_http_headers_module
  • Nginx add_header 設定の落とし穴
  • Nginxのadd_headerには十分注意してください。サイトが安全でなくなる可能性があります。
  • 場所のadd_headerディレクティブがサーバーのadd_headerディレクティブを上書きしています
  • nginx 設定における add_header の落とし穴

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • CentOS7 のシステム サービスに Nginx を追加する方法
  • nginx を使用して同じドメイン名で複数の Vue プロジェクトをデプロイし、リバース プロキシを使用する方法
  • Nginx 設定ファイルの差異を監視し、電子メールアラートを送信する Python 実装例
  • Centos7.x での Nginx のインストール、SSL 設定、一般的なコマンドの詳細な説明
  • docker で nginx+php+mysql を設定する方法
  • 無効な Nginx クロスドメイン設定 Access-Control-Allow-Origin の解決策
  • Nginx に React プロジェクトをデプロイする方法の例
  • nginx.conf ファイルの構文強調表示とフォーマット設定には nginx.vim ツールを使用します。
  • nginx 設定チュートリアルにおける add_header の落とし穴の詳細な説明
  • https ウェブサイトを展開し、Nginx でアドレス書き換えを構成するための詳細な手順

<<:  Reactにおけるキーの役割の詳細な説明

>>:  MySQL 5.7.18 マスタースレーブレプリケーション設定(マスター 1 台とスレーブ 1 台)チュートリアルの詳細な説明

推薦する

モバイルウェブサイトの開発に関するいくつかの結論

ウェブサイトのモバイル版には、少なくともいくつかの基本機能が必要です。 1. ページの適用性の問題:...

CSS 3.0 テキストホバージャンプ特殊効果コード

これは、CSS 3.0 で実装されたテキストのホバーとジャンプ効果です。効果は次のとおりです。 以下...

Dockerコアとインストールの具体的な使い方

1. Docker とは何ですか? (1)DockerはLinuxコンテナ内でアプリケーションを実行...

ページ要素の絶対位置と相対位置に関するある程度の理解

今日から、定期的にちょっとした豆知識を整理していきます。簡単なものもあるかもしれませんが、どれも役に...

WeChatアプレットbindtapとcatchtapの違いの詳細な説明

目次1. イベントとは何ですか? 2. イベントの使い方3. バインドタップとキャッチタップの違い4...

Windows での MySQL 8.0.12 のインストール手順と基本的な使用方法のチュートリアル

この記事では、WindowsでのMySQL 8.0.12のインストール手順と使用方法のチュートリアル...

iframe でページを開く方法

解決:リンクのターゲット属性値をターゲット フレームワーク名と同じに設定するだけです。具体的な手順:...

Nexus を使用して jar パッケージをプライベート サーバーに追加する方法

なぜ Nexus プライベート サーバーを構築する必要があるのでしょうか。その理由は非常に簡単です。...

Vuex全体のケースの詳細な説明

目次1. はじめに2. 利点3. 使用手順1. Vuexをインストールする2. Vuexを参照する3...

Centos Docker ブリッジ モードでホスト Redis サービスにアクセスできないというトラブルシューティングの経験

背景:以前、コンテナ内のホストが提供する Redis サービスにアクセスする必要があるプロジェクトを...

Windows 10 での MySQL 5.7.21 winx64 のインストールと設定方法のグラフィック チュートリアル

mysql 5.7.21 winx64 のインストールと設定方法: MySQLのコミュニティバージョ...

CSS コード省略 div+css レイアウト コード省略仕様

略語を使用すると、CSS ファイルのサイズが小さくなり、読みやすくなります。 CSS 省略形の主なル...

Vue カプセル化 TabBar コンポーネントの完全なステップ記録

目次実装のアイデア:ステップ 1: TabBar と TabBarItem のコンポーネント カプセ...

ECMAScript6 におけるマップマッピングの基本概念と一般的な方法

目次マッピングとは何かオブジェクトとマップの違いマップの共通メソッド宣言と初期化割り当てセットキー値...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...