nginx 設定チュートリアルにおける add_header の落とし穴の詳細な説明

nginx 設定チュートリアルにおける add_header の落とし穴の詳細な説明

序文

add_header は、headers モジュールで定義されたディレクティブです。名前が示すように、http 応答ヘッダーを追加するために使用されます。ただし、これは単に「追加」されただけであり、書き直されたわけではないことに注意してください。したがって、ヘッダーがすでに存在する場合、add_header を使用すると問題が発生します。さらに、nginx の以前のバージョンでは、add_header はエラー ページでの使用をサポートしていません。

これは多くの落とし穴があるコマンドです。処理段階は location 処理より後になります。location に書き込むことはできますが、別の location を書き換えると、前の location で処理されなかった add_header は失われます。例えば:

場所 = /a {
 add_headerに1を追加します。
 //b を書き換えます。
}
場所 = /b {
 ヘッダーを追加します b 2;
 204を返します。
} 

頭に1はないですよね?これは落とし穴だ!

もう 1 つの落とし穴は、冒頭で述べた重複の問題です。たとえば、コンテンツに Content-Type を設定したいのですが、default_type がグローバルに設定されているため、重複してしまいます。

デフォルトタイプ 'text/plain';

場所 = /a {
 ヘッダーコンテンツタイプ application/json を追加します。
 200 '"OK"' を返します。
} 

もちろん、この場所の default_type を空のままにしたり、add_header を使用せずにこの場所の default_type を直接変更するなど、多くの解決策があります。

最後の大きな落とし穴は、エラー ページでは機能しないことですが、これもドキュメントで明確に定義されています。たとえば、次の例をご覧ください。

場所 = /a {
 ヘッダーコンテンツタイプ application/json を追加します。
 404 '"見つかりません"' を返します。
}

JSONで応答したいのですが、ステータスコードが404なので、ここでのadd_headerは効果がありません。

この例では default_type の問題を解決できますが、他のヘッダーの場合はどうなるでしょうか?たとえば、Access-Control-Allow-Origin では何をすればよいでしょうか?その場合、Lua またはその他のサードパーティ モジュールを使用する以外に解決策はありません。もちろん、nginx はこの問題を認識しているため、ドキュメントには、always と呼ばれるパラメータがバージョン 1.7.5 以降でサポートされていることも記載されています。 nginx 自体はこの問題を解決しますが、1.6.2 ベースの tengine では問題が発生します。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。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 でアドレス書き換えを構成するための詳細な手順

<<:  MySQL ページング中にオフセットが大きすぎる場合の SQL 最適化の経験の共有

>>:  Svelte の Defer Transition を Vue で実装する方法

推薦する

RHEL8 /CentOS8 でマルチノード Elastic Stack クラスターを構築する方法

一般的に ELK スタックとして知られる Elastic スタックは、Elasticsearch、L...

星のきらめき効果を実現するネイティブ js

この記事の例では、星のきらめき効果を実現するためのjsの具体的なコードを共有しています。具体的な内容...

Docker 経由で CentOS コンテナを作成する手順

目次序文コンテナ間の通信を容易にするためのブリッジネットワークを作成するCentOS7イメージを使用...

シンプルな虫眼鏡効果を実現するJavaScript

大きな箱の中に写真があります。マウスをその上に置くと、半透明のマスク レイヤーが表示されます。マウス...

VMware15.5でcentos8.1をインストールし、物理メモリが不足する問題に対処する最も完全なチュートリアル

1. 仮想マシンの準備1. 新しい仮想マシンを作成する 2. 仮想マシンのカスタマイズを選択する 3...

Vue+echarts で積み上げ棒グラフを実現

この記事では、積み上げ棒グラフを実装するためのVue+echartsの具体的なコードを参考までに紹介...

PHP 開発環境の構築に関する win10 docker-toolsbox チュートリアル

画像をダウンロード docker プル mysql:5.7 docker pull php:7.2-...

CenterOS7 インストールおよび構成環境 jdk1.8 チュートリアル

1. まずcenterosに付属のJDKをアンインストールします rpm-qa|grepopenjd...

プロフェッショナルおよび非プロフェッショナルのウェブデザイン

まず、Web ページのスタイルの形成は、主に Web ページのレイアウト設計、ページの色処理、画像と...

VMware および CentOS システムのインストール方法 - ルート パスワードをリセットする

今日のタスク1. Linuxディストリビューションの選択2.vmwareが仮想マシン(centos)...

CSS 命名: BEM、スコープ付き CSS、CSS モジュール、CSS-in-JS の説明

CSS の適用範囲はグローバルです。プロジェクトがどんどん大きくなり、参加する人が増えるにつれて、命...

mysql5.7.21 utf8 エンコーディングの問題と Mac 環境での解決方法

1. 目標: mysql の character_set_server の値を latin1 から ...

Oracle10パーティションとMySQLパーティションの違いの詳細な説明

一般的に使用される Oracle10g パーティションは、範囲 (範囲パーティション)、リスト (リ...

ウェブデザインの教育または学習プログラム

セクションコース内容営業時間1 ウェブデザインの概要2 2 HTML 基本タグとフォーマットタグ 2...

TypeScript をインストール、使用、自動コンパイルする方法に関するチュートリアル

1. TypeScriptの紹介前回の記事ではTypeScriptのインストール、使い方、自動コンパ...