ホームページ >運用・保守 >Nginx >Nginx add_header命令の分析例

Nginx add_header命令の分析例

WBOY
WBOY転載
2023-05-17 18:37:061567ブラウズ

はじめに

ご存知のとおり、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 のみです:

Nginx add_header命令の分析例

これは理にかなっていますが、これは通常の動作です。 、しかし、それは常に人々を引き起こします。少し強制的で不快な感じがします。サーバーは http 構成を失い、場所はサーバー構成を失いますが、2 つの場所は同じレベルにあります。

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

以上がNginx add_header命令の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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