1 つの記事で Nginx ロケーション マッチングの実装を理解する

1 つの記事で Nginx ロケーション マッチングの実装を理解する

チームはフロントエンドとバックエンドを分離しているため、フロントエンドが Nginx とノード層を引き継ぎます。日常業務では、Nginx をかなり多く扱います。その中でも、場所は最も多く使用され、最も変更される場所です。以前は、位置の一致ルールについて漠然とした理解しかありませんでした。位置がどのように一致するかを理解するために、時間をかけて情報を調べ、この記事にまとめました。これが皆様のお役に立てば幸いです。

文法規則

場所 [ = | ~ | ~* | ^~ ] uri { ... }
場所 @name { ... }

構文は単純です。場所のキーワード、オプションの修飾子、一致する文字、そして実行するアクションを中括弧で囲んで指定します。

修飾子

  • = は完全一致を示します。ヒットは、要求された URL パスが後続の文字列と完全に一致する場合にのみ発生します。
  • ~ は、ルールが正規表現を使用して定義され、大文字と小文字が区別されることを示します。
  • ~* は、ルールが正規表現を使用して定義され、大文字と小文字が区別されないことを示します。
  • ^~ は、この記号に続く文字が最適な一致である場合にこのルールが採用され、それ以上の検索は実行されないことを意味します。

マッチングプロセス

リクエスト URL をシリアル化します。たとえば、%xx などの文字をデコードし、URL 内の連続する複数の / を削除し、URL 内の .、.. などを解析します。このステップはマッチングの前提条件です。

場所を表現する方法は 2 つあり、1 つはプレフィックス文字を使用する方法、もう 1 つは正規表現を使用する方法です。正規表現の場合は、その前に ~ または ~* 修飾子が付きます。

具体的なマッチングプロセスは以下のとおりです。

まず、プレフィックス文字を使用して定義された場所を確認し、最も長く一致する項目を選択して記録します。

完全に一致する場所、つまり = 修飾子を持つ場所が見つかった場合、検索は終了し、その構成が使用されます。

次に、正規表現を使用して定義された場所を順番に検索します。一致が見つかった場合は、検索を停止し、それによって定義された構成を使用します。

一致する通常の場所がない場合は、以前に記録された最も長い一致するプレフィックス文字の場所が使用されます。

上記のマッチングプロセスに基づいて、次の 2 つの洞察を得ることができます。

  1. 正規表現を使用して定義された場所が構成ファイル内に表示される順序は重要です。最初に一致する正規表現が見つかると、検索は停止し、後で定義された正規表現が再び一致する可能性がなくなるためです。
  2. 完全一致を使用すると、検索が高速化されます。たとえば、/ を頻繁に要求する場合は、= を使用して場所を定義できます。


次に、例を使用してマッチングプロセスを説明します。

次のような構成ファイルがあるとします。

場所 = / {
  [ 構成A ]
}

位置 / {
  [ 構成 B ]
}

場所 /user/ {
  [ 構成 C ]
}

場所 ^~ /images/ {
  [ 構成 D ]
}

場所 ~* \.(gif|jpg|jpeg)$ {
  [ 構成 E ]
}

リクエスト/完全一致 A、それ以上の検索はありません。

リクエスト /index.html は B と一致します。まず、一致するプレフィックス文字を検索し、構成 B に最も長く一致するものを見つけて、次に、一致する正規表現を順番に検索します。何も見つからないため、前のタグからの最長一致、つまり構成 B が使用されます。

/user/index.html を要求すると C に一致します。まず、最長一致 C を見つけます。その背後に一致する正規表現がないため、最長一致 C が使用されます。

/user/1.jpg を要求すると E に一致します。まず、プレフィックス文字を検索して最長一致 C を見つけ、次に通常の検索を続行して一致 E を見つけます。したがって、E を使用します。

/images/1.jpg を要求すると D に一致します。まず、プレフィックス文字を検索し、最長一致 D を見つけます。ただし、特別なのは、^~ 修飾子を使用し、後続の正規表現一致検索を実行しなくなるため、D が使用されることです。ここで、先行する修飾子がない場合、最終的な一致は実際には E になります。その理由について考えてみましょう。

リクエスト /documents/about.html は B と一致します。 B は、/ で始まるすべての URL が一致することを意味するためです。上記の構成では、B のみが満たされるため、B が一致します。

場所@nameの使用

@ は名前付きの場所を定義するために使用されます。主に内部リダイレクトに使用され、通常のリクエストの処理には使用できません。使い方は以下のとおりです。

位置 / {
  try_files $uri $uri/ @カスタム
}
場所 @custom {
  # ...何かをする
}

上記の例では、URL にアクセスしようとして対応するファイルが見つからない場合、カスタム名の場所 (ここではカスタム) にリダイレクトされます。

名前付きの場所は、他の名前付きの場所内にネストすることはできないことに注意してください。

URL の末尾の / は必須ですか?

URL 末尾の / については注意すべき点が 3 つあります。最初のポイントは場所の構成に関連していますが、他の 2 つのポイントは関連していません。

場所に / 文字が存在するかどうかは影響しません。つまり、/user/ と /user は同じです。

URL 構造が https://domain.com/ の形式の場合、末尾に / があってもリダイレクトは発生しません。ブラウザはリクエスト時にデフォルトで / を追加するためです。ただし、多くのブラウザではアドレスバーに / が表示されません。これを確認するには、Baidu にアクセスしてください。

URL 構造が https://domain.com/some-dir/ の場合。末尾の / がない場合、リダイレクトが発生します。慣例によれば、URL の末尾の / はディレクトリを表し、/ はファイルを表さないためです。したがって、/some-dir/ にアクセスすると、サーバーはそのディレクトリ内の対応するデフォルト ファイルを自動的に検索します。 /some-dir にアクセスすると、サーバーはまず some-dir ファイルを検索します。ファイルが見つからない場合は、some-dir をディレクトリとして扱い、/some-dir/ にリダイレクトして、そのディレクトリ内のデフォルト ファイルを検索します。あなたのウェブサイトがこのような状態かどうかをテストすることができます。

要約する

場所の設定には、プレフィックス文字と正規表現の 2 つの形式があります。一致を検索するときは、まずプレフィックス文字を検索し、最長の一致を選択してから、正規表現を検索します。正規表現の優先順位はプレフィックス文字の優先順位よりも高くなります。

正規表現は、設定ファイル内に出現する順序で検索されます。したがって、正規表現の順序は非常に重要です。より高度な正規表現を先頭に配置することをお勧めします。

完全一致に = を使用すると、検索順序を高速化できます。ルート ドメイン名が頻繁にアクセスされる場合は、= を使用することをお勧めします。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx 設定場所のマッチング優先順位の簡単な分析
  • Nginx ロケーション設定(ロケーションのマッチング順序)の詳細な説明
  • nginx のロケーションと書き換えの使用法の詳細な説明
  • Nginx におけるサーバーとロケーションのマッチングロジックの詳細な理解
  • Nginx 構成の場所の一致ルールの例の説明

<<:  JavaScript でピンボール ゲームの Web バージョンを実装する

>>:  Windows ベースの MySQL 8.0.12 のインストール

推薦する

CentOs システムで Python と yum をアンインストールするソリューション

事故の背景: 数日前、プロジェクトの必要性により、サーバーに python-mysql モジュールを...

仮想マシンUbuntu 16.04がインターネットに接続できない問題の解決策

Ubuntu をインストールしたばかりですが、開いたときにネットワーク接続がありませんでした。右上隅...

JSはキャンバス技術を使用してeChartsの棒グラフを模倣します

Canvas は HTML5 の新しいタグです。js を使用して Canvas 描画 API を操作...

SQL実装 LeetCode (176. 2番目に高い給与)

[LeetCode] 176. 2番目に高い給与従業員テーブルから 2 番目に高い給与を取得する ...

HTMLヘッダータグの使用に関する詳細な説明

HTMLはヘッドとボディの2つの部分で構成されています** ヘッド内のタグはヘッドタグです** タイ...

MySQL 8.0.20 のインストールと設定の詳細なチュートリアル

この記事では、MySQL 8.0.20のインストールと設定方法についての詳細なチュートリアルを参考ま...

Dockerのクイックガイド

Docker は、安全で繰り返し可能な環境でソフトウェアを自動的にデプロイする方法を提供し、コンピュ...

リンクAの意味論、書き方、ベストプラクティス

リンク A のセマンティクス、ライティング スタイル、およびベスト プラクティス。私は JavaEy...

npm 淘宝ミラー変更説明

1. トップレベルの使用法1. cnpmをインストールする npm i -g cnpm --regi...

CSS レイアウト チュートリアル: 垂直方向の中央揃えを実現する方法

序文最近、フロントエンドの知識をまとめており、いくつかのインタビューにも参加しました。インタビュー中...

Ubuntu 18.04にmysql5.7をインストールする

Ubuntu 18.04では参考までにmysql 5.7をインストールします。具体的な内容は以下のと...

Nginxを再コンパイルしてモジュールを追加する方法

Nginx をコンパイルしてインストールするときに、http_ssl_module などの一部のモジ...

Dockerサーバーのストレージリソースプール不足問題の解決

目次1. 問題の説明2. 問題分析3. 問題解決1. Dockerのディスク使用量を確認する2. 再...

docker cp ファイルをコピーしてコンテナに入る

実行中のコンテナに入る # コンテナに入り、新しいターミナルを開きます# docker exec -...

MySQL 最適化技術における Limit クエリの最適化分析

序文実際のビジネスでは、ページングは​​一般的なビジネス要件です。次に、制限クエリを使用します。制限...