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 台)チュートリアルの詳細な説明

推薦する

EclipseのプロジェクトをTomcatに追加できない問題を解決する方法

1. プロジェクトを右クリックしてプロパティを選択します2. プロジェクトファセットをクリック3. ...

Ubuntu 18.04 のインストールで「ldlinux.c32 のロードに失敗しました」というエラーが表示され、解決手順がわかりません

序文私は Win7 を搭載した古いラップトップを持っています。古いシステムを維持しながら、同時に U...

Vue データの応答性の概要

データの応答性について話す前に、Vue はデータに対して具体的に何を行うのかという非常に重要な問題を...

MySQL複合インデックスの詳細な研究

複合インデックス (結合インデックスとも呼ばれます) は、複数の列に対して作成されるインデックスです...

MySQLビューの原理と使用法の詳細な説明

この記事では、例を使用して MySQL ビューの原理と使用方法を説明します。ご参考までに、詳細は以下...

Linux の一般的なコマンド chmod を使用して、ファイルの権限 777 と 754 を変更します。

よく使用されるコマンドは次のとおりです。 chmod 777 文件或目錄例: chmod 777 /...

JavaScript フロー制御 (分岐)

目次1. プロセス制御2. シーケンシャルプロセス制御3. 分岐フロー制御if文1. 支店構造2. ...

CSS3実践手法のまとめ(推奨)

1. 丸い境界線: CSSコードコンテンツをクリップボードにコピー境界線の半径: 4px ; 2....

DD DT DLタグの使用例

通常は <ul><li> タグを使用しますが、dd タグと dt タグも便利...

MySQL タイムブラインドインジェクションの 5 つの遅延方法

MySQL タイム ブラインド インジェクションの 5 つの遅延方法 (PWNHUB の予期しない解...

複雑なSQLクエリを含むMySQLの一般的なSQL文の概要

1. 複雑なSQLクエリ1.1. 単一テーブルクエリ(1)指定の列を選択する[例] 全生徒の生徒ID...

Bash スクリプトでの配列メソッドの作成と使用の概要

Bashで配列を定義するbash スクリプトで新しい配列を作成する方法は 2 つあります。 1 つ目...

ウェブ開発におけるクロスドメインの理由に対する複数のソリューション

目次クロスドメインの理由JSONP Nginxソリューションバックエンドソリューションクロスドメイン...

Docker のインストールと構成コマンドのコード例

Dockerのインストール依存パッケージをインストールする sudo yum install -y ...