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

推薦する

JS 1次元配列を3次元配列に変換する例

今日、CSDN の Q&A セクションで友人が質問をしているのを見ました。彼は 1 次元配列...

きちんとしたHTMLマークアップを使用してページを構築します

インターネットは絶えず進化する有機体です。長期にわたってインターネットの発展に適応できるページを構築...

iptables の再起動後に Docker の iptables ルールの完全なプロセスが失われる

原因と結果1. ansibleコマンドを使用してジャンプサーバー上のマシンBをテストすると、次のエラ...

HTML割引価格計算の実装原理とスクリプトコード

コードをコピーコードは次のとおりです。 <!DOCTYPE HTML PUBLIC "...

Jenkinsを使用してプロジェクトを別のホストにデプロイするプロセス

環境ホスト名IPアドレス仕えるジェンキンス192.168.216.200トムキャット、ジェンキンスサ...

CSS でマウスの位置をマッピングし、マウスを動かしてページ要素を制御する (サンプル コード)

マウスの位置をマッピングしたり、ドラッグ効果を実装したりすることは、 JavaScriptで行うこと...

DockerプライベートライブラリHarborのアーキテクチャとコンポーネントの説明

この記事では、Harbor アーキテクチャの構成と、実行時に各コンポーネントを使用する方法について説...

Reactでコンポーネントがどのように通信するかの詳細な説明

1. 何ですかコンポーネント間の通信は、次の 2 つの単語に分けることができます。コンポーネントコ...

無効な Nginx クロスドメイン設定 Access-Control-Allow-Origin の解決策

nginx バージョン 1.11.3次の構成を使用すると、検証は無効になり、クロスドメインの問題が依...

Linux での MySQL 8.0.25 のインストールと設定のチュートリアル

LinuxにMySQL 8.0.25をインストールするための最新のチュートリアルを参考にしてください...

docker-compose ネットワーク設定についての簡単な説明

ネットワーク使用チュートリアル公式サイト docker-compose.yml リファレンスドキュメ...

Dockerデータストレージのバインドマウントの詳細な説明

この記事を読む前に、Volumes について予備知識を身に付けておいてください。詳細については、こち...

JavaScriptのモジュール性を理解する方法

目次1. ブラウザのサポート2.エクスポートモジュールのエクスポート3. モジュールをインポートする...

Dockerがプライベート倉庫Harborを構築する手順

港Harborは、エンタープライズレベルのプライベートDockerイメージリポジトリを構築するための...

Linux でマウントされたファイルシステムの種類を表示する方法

序文ご存知のとおり、Linux は ext4、ext3、ext2、sysfs、securityfs、...