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 SHOW PROCESSLISTはトラブルシューティングの全プロセスを支援します

1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...

HTML テーブルタグチュートリアル (44): テーブルヘッダータグ

<br />ソース コード内で表の構造を明確に区別するために、HTML 言語では、表のヘ...

Bootstrapはカルーセルの効果を実現します

この記事では、カルーセルマップの効果を実現するためのBootstrapの具体的なコードを参考までに共...

HTML の入力の readonly 属性と disabled 属性の違いについて簡単に説明します。

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにしま...

Linux DHCPサービスの詳細な説明

目次1. DHCP サービス (動的ホスト構成プロトコル) 1. 背景2. 概要3. 利点4.DHC...

要素の水平方向の中央揃えを実現する3つの方法と、固定レイアウトとフローレイアウトの概念の理解

CSS でテキストを中央揃えにするプロパティは非常に簡単に実現できます。text-align:cen...

Linux で実行中のバックグラウンド プログラムを表示および終了する方法

Linux タスク管理 - バックグラウンド実行と終了fg、bg、ジョブ、&、ctrl + ...

Nginxはクロスドメインの問題を解決し、サードパーティのページを埋め込む

目次序文困難クロスドメイン定義nginxの機能リバースプロキシ静的と動的の分離達成しようとする最終結...

Vue vee-validateプラグインの簡単な使い方

目次1. インストール2. インポート3. 検証ルールを定義します(エクスポート用に js ファイル...

Vueはページに透かし効果を追加する機能を実装します

最近、あるプロジェクトに取り組んでいたとき、ページに透かし効果を追加するように依頼されました。さっそ...

Vue で配列パラメータを渡すための get / delete メソッド

フロントエンドとバックエンドがやり取りする場合、get または delete を介してバックエンドに...

Centos7 で yum を使用して Ceph 分散ストレージをインストールするチュートリアル

目次序文yumソース、epelソースを設定するCephソースの設定Cephとそのコンポーネントをイン...

デザインにおいて無視できないインタラクティブデザインにおける製品状態の分析

製品デザインのプロセスにおいて、デザイナーは常に写真を非常に美しくすることを好みます。仮想ページのコ...

CSSの使用に関する深い理解 clear:both

clear:both清除浮動これは私が常に持っていた印象ですが、私はこれをめったに使用せず、私の理...