はじめに
ご存知のとおり、nginx 構成ファイルは add_header ディレクティブを使用して応答ヘッダーを設定します。
curl を使用してサイトの情報を確認し、返されたヘッダーが予期したものと異なることを確認します:
http/2 200 date: thu, 07 feb 2019 04:26:38 gmt content-type: text/html; charset=utf-8 vary: accept-encoding, cookie cache-control: max-age=3, must-revalidate last-modified: thu, 07 feb 2019 03:54:54 gmt x-cache: miss server: cloudflare ...
メイン サイトは nginx.conf で hst とその他のヘッダーを構成しました:
add_header strict-transport-security "max-age=63072000; preload"; add_header x-frame-options sameorigin; add_header x-content-type-options nosniff; add_header x-xss-protection "1; mode=block";
しかし、応答ヘッダーにはこれらのヘッダーがありません。通常のヘッダーに加えて、その場所にはヘッダー X キャッシュが 1 つだけ構成されています。
第一印象は、CDN がこれらのヘッダーをフィルタリングしているということでしょうか?そこで、cloudflare のドキュメントを探しましたが、これらを処理できるものは見つかりませんでした。そこで考えたのですが、CDN はこれらをフィルタリングするために何をしているのでしょうか?食べた後は満腹ですか?彼らは検閲なんてやってないよ!
問題はnginxの設定に移ります。 Google を開いて「nginx location add_header」を検索すると、多くの欠陥が見つかります。公式 Web サイトの add_header ドキュメントをクリックすると、次の説明があります (他の情報は省略されています):
there might be some add_header directives. これらのディレクティブは、次の場合にのみ前のレベルから継承されます。現在のレベルに add_header ディレクティブが定義されていません。
「現在のレベルに add_header ディレクティブが定義されていない場合に限り、これらのディレクティブは前のレベルから継承される」ことに注目してください。つまり、親設定は、現在のレベルに add_header ディレクティブがない場合にのみ継承されます。したがって、私の質問は明確です。場所に add_header があり、nginx.conf の設定は破棄されます。
これは nginx の意図的な動作であり、バグまたは落とし穴であるとは言えません。しかし、この文を深く理解すると、最新の add_header のみが機能するという、より興味深い現象に気づくでしょう。 add_header は http、server、location で設定できますが、最も近い設定が有効になり、上記の設定はすべて無効になります。
しかし、問題はそれだけではありません。場所が別の場所に書き換えられた場合、最終結果には 2 番目のヘッダーのみが表示されます。例:
location /foo1 { add_header foo1 1; rewrite / /foo2; } location /foo2 { add_header foo2 1; return 200 "ok"; }
/foo1 または /foo2 のリクエストに関係なく、最終ヘッダーは foo2 のみです:
これは理にかなっていますが、これは通常の動作です。 、しかし、それは常に人々を引き起こします。少し強制的で不快な感じがします。サーバーは http 構成を失い、場所はサーバー構成を失いますが、2 つの場所は同じレベルにあります。
親設定を継承できず、現在のブロックで命令を繰り返したくない場合は、include 命令を使用すると解決できます。
以上がNginx add_header命令の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。