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 のインストール

推薦する

MySql バッチに挿入するときにデータの重複を避ける方法

目次序文1. ignore を挿入2. 重複キーの更新時3. を置き換える要約する序文Mysql は...

タブバーのいくつかの実装方法(推奨)

タブ: カテゴリ + 説明タグバー: カテゴリ => ユーザーに現在地と目的地を知らせる1. ...

MySql 5.7.17 winx64 のインストールと設定に関する詳細なチュートリアル

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカウ...

MySQL Installer Community 5.7.16 インストール詳細チュートリアル

この記事では、MySQL インストールの詳細なチュートリアルを記録し、全員と共有します。 1. バー...

MySQLで負荷分散を実装する方法

序文MySQL は、クライアント/サーバー構造に基づく、高速、高性能、マルチスレッドのオープン ソー...

Tomcat9 Windows サービスのインストールに関する詳細なチュートリアル

1. 準備1.1 service.bat を含む tomcat 圧縮パッケージをダウンロードします。...

Dockerコンテナは定期的にデータベースをバックアップし、指定されたメールボックスに送信します(設計アイデア)

目次1. 背景: 2. デザインのアイデア: 3. 起動スクリプトを書く4. イメージを構築する5....

Vueは複数列レイアウトドラッグを実装します

この記事では、マルチカラムレイアウトドラッグを実装するためのVueの具体的なコードを参考までに共有し...

相同性とクロスドメイン、jsonp(関数カプセル化)、CORS原則の詳細な分析

目次同一起源ポリシーAjax リクエストの制限: Ajaxは自身のサーバーにのみリクエストを送信でき...

Vue での weixin-js-sdk の一般的な使用方法の詳細な説明

リンク: https://qydev.weixin.qq.com/wiki/index.php?ti...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

Windows 10 で MySQL を完全にアンインストールして再インストールするための詳細な手順

さまざまな理由で、誰もが MySQL を再インストールする必要があると思います。 MySQL と Q...

Vueは商品詳細ページの商品タブ機能を実装します

この記事の例では、商品詳細ページ機能を実現するためのVueの商品タブの具体的なコードを参考までに共有...

CentOS 7 構成 Tomcat9+MySQL ソリューション

Tomcatの設定まずTomcatをインストールするTomcatのインストールは、Tomcatのイン...