Nginx がリクエストを処理する際のマッチングルールの詳細な分析

Nginx がリクエストを処理する際のマッチングルールの詳細な分析

nginx はリクエストを受信すると、まず server_name でサーバーを照合し、次にサーバー内の場所を使用して照合を続行します。

server_name に一致

nginx では、server_name によって、リクエストを受信したときにどのサーバーが使用されるかが決まります。nginx は、リクエスト ヘッダーの Host フィールドを使用して server_name と照合します。server_name を定義するときは、フル ネーム、ワイルドカード名、または正規表現名を使用できます。照合順序は次のとおりです。

  • 完全一致
  • 文字列の前のワイルドカード文字、つまり *.example.org
  • ワイルドカードマッチング後、例: mail.*
  • 正規表現マッチング

一致するものが見つからない場合は、default_server が処理に使用されます。定義されていない場合は、最初に定義されたものが使用されます。例として 3 つの単純なサーバーを使用し、ポート 80 を listen し、server_name をそれぞれ *.org、*.net、*.com に設定します。

サーバー{
 聞く 80;
 サーバー名 example.org www.example.org;
 401 を返します。
}

サーバー{
 聞く 80;
 サーバー名 example.net www.example.net;
 402 を返します。
}

サーバー{
 聞く 80;
 サーバー名 example.com www.example.com;
 403 を返します。
}

上記の設定では、デフォルト サーバーは最初のサーバーです。存在しないサーバーにアクセスすると、401 が返されます。ただし、default_server を使用して手動でデフォルト ホストを設定できます。default_server は、次のように listen フィールドで設定されます。

サーバー{
 80 default_server をリッスンします。
 サーバー名 example.net www.example.net;
}

再度マッチングを行った際に、一致するものが見つからない場合は、このサーバーが使用されます。

アクセスが拒否されました

ホスト フィールドのないリクエストを禁止する場合は、次のサーバーを定義できます。

サーバー{
 聞く 80;
 サーバー名 "";
 444を返します。
}

server_name は空の文字列として定義されます。Host フィールドが空であるか存在しない場合は、このサーバーが一致し、404 ステータス コードが返されます。

Nginx の 444 ステータスは特殊です。444 が返された場合、Web サイトに接続できないのと同様に、クライアントはサーバーから返された情報を受け取らず、ブラウザには直接 502 が表示されます。ただし、リバース プロキシを使用している場合は、通常のステータス コードが表示されます。

存在しないホストへのアクセスを禁止したい場合は、次のように定義できます。

サーバー{
 80 default_server をリッスンします。
 サーバー名_;
 444を返します。
}

_ には特別な意味はありません。ドメイン名は _ 内には表示されないため、実際のドメイン名と同じにはなりません。他の不正な文字についても同様です。

IPとserver_nameの両方に一致

次に、異なるリスニング IP と異なる server_name の混在を処理する方法を見てみましょう。

サーバー{
 192.168.1.1:80 を聴く;
 サーバー名 example.org www.example.org;
}

サーバー{
 192.168.1.1:80 を聴く;
 サーバー名 example.net www.example.net;
}

サーバー{
 192.168.1.2:80 を聴く;
 サーバー名 example.com www.example.com;
}

この設定では、nginx は最初に IP を照合し、次に server_name を照合します。一致する server_name がない場合、デフォルトのサーバーが使用されます。たとえば、ドメイン名 www.example.com のリクエストが 192.168.1.1:80 から送信され、192.168.1.1:80 でリッスンしているサーバーが 2 つしかなく、どちらも www.example.com に一致しない場合は、2 つのサーバーのデフォルトのホストが使用されます。リスナーの定義に default_server が使用されていないため、デフォルトは最初のサーバー www.example.org です。もちろん、default_server を定義することもできます。

サーバー{
 192.168.1.1:80 を聴く;
 サーバー名 example.org www.example.org;
}

サーバー{
 192.168.1.1:80 default_server をリッスンします。
 サーバー名 example.net www.example.net;
}

サーバー{
 192.168.1.2:80 default_server をリッスンします。
 サーバー名 example.com www.example.com;
}

一致する場所

nginx はサーバーに一致した後、場所を介してリクエストの処理を続行します。次に例を示します。

サーバー{
 172.17.0.3:80を聴く;
 サーバー名_;

 位置 / {
 401 を返します。
 }

 場所 ~*\.(gif|jpg|png)$ {
 402 を返します。
 }
 
 場所 ~*\.(gif|jpg|png)$ {
 404 を返します。
 }

 場所 /api {
 403 を返します。
 }
}

Nginx は最初にすべての場所でプレフィックスを検索して一致させます。プレフィックスを一致させた後、正規表現で定義された場所を順番に一致させます。一致した場合は終了します。一致しない場合は、前にプレフィックスと一致した場所を使用して処理します。以下は、特定の一致の例です。

  • /x.gif リクエストは、最初にプレフィックス / と一致し、次に残りの x.gif と場所の正規表現を使用して一致し、最初に場所 ~*\.(gif|jpg|png)$ と一致し、402 を返します。
  • /x.pdf リクエストは、x.pdf が一致しないため、場所 / を使用して処理されます。
  • /api/x.gif は、最初にプレフィックス /api と一致し、次に残りの x.gif と場所の正規表現を使用して一致し、最初に場所 ~*\.(gif|jpg|png)$ と一致し、402 を返します。
  • /api/x.pdf へのリクエストは、x.pdf が一致しないため、場所 /api を使用して処理されます。

参照する

  • nginxがリクエストを処理する方法
  • サーバー名

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Nginx ロケーションマッチングルールの詳細な説明
  • Nginxサーバのロケーションディレクティブマッチングルールの詳細な説明
  • Nginx ロケーションマッチングルールの例
  • nginx マッチングルールの簡単な概要 (推奨)
  • Nginx のロケーション マッチング ルールの概要
  • Nginx ロケーション ディレクティブ URI マッチング ルールの詳細な概要

<<:  MySQL マスターとスレーブの不整合とその解決策の詳細な説明

>>:  {{ }} で関数を直接使用する WeChat アプレットの例

推薦する

Nginx 正規表現の詳細な説明

Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...

Vue でユーザー権限に基づいてルートを動的に追加する方法

ユーザーの権限に応じて異なるメニュー ページを表示します。知識ポイントルートガード(事前ガードを使用...

MySQL 8.0.24 リリースノートのいくつかの改善点

目次1. 接続管理2. オプティマイザレベルでの改善3. 機能の改善4. パフォーマンススキーマの最...

MySQL 8.0 バージョンで getTables がすべてのデータベース テーブルを返す問題の簡単な分析

序文この記事では、主にライブラリ内のすべてのテーブルを返すMysql8.0ドライバgetTables...

フォームのデフォルトの送信方法を変更する方法

htmlのデフォルトの送信方法は、postではなくgetです。postに変更したい場合は、 meth...

HTMLの基本構文は、HTMLを学び始めたばかりの人にとって便利です。

1.1 一般的なマーキング一般的なタグは開始タグと終了タグで構成されます。構文は次のとおりです: ...

JS がビデオ弾幕効果を実現

これを実現するには、ES6 モジュール開発とオブザーバー モードを使用します。オブザーバー パターン...

UA による Web サイトのクロールを防ぐ Nginx のクローラー対策戦略

クローラー対策ポリシー ファイルを追加しました: vim /usr/www/server/nginx...

SQL 文を使用してデータを収集する場合の sum 関数と count 関数の if 判定条件の使用法の説明

まず、例を挙げてみましょう(読みたくない場合は、以下の要約だけ読んでください)。 order_typ...

MySQL実行計画の詳細な説明

EXPLAIN ステートメントは、MySQL がステートメントを実行する方法に関する情報を提供します...

WeChatアプレットはシンプルな計算機を実装する

参考までにWeChatアプレットで書かれた簡単な計算機です。具体的な内容は次のとおりです。 jisa...

ffmpeg 中国語パラメータの詳細な説明

FFMPEG 3.4.1 バージョンパラメータの詳細使用方法: ffmpeg [オプション] [[入...

Linuxサービスの監視と運用および保守

目次1. psutilパッケージをインストールする次に、オペレーティングシステム内のすべてのサービス...

MySql の忘れたパスワードの変更方法はバージョン 5.7 以上に適しています

1. まずmysqld.exeプロセスを停止します2. cmd を開き、mysql の bin ディ...