Nginx ロケーションマッチングルールの例

Nginx ロケーションマッチングルールの例

1. 文法

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

2. 説明

上記の構文から、location は 3 つの部分に分けられることがわかります。1 つずつ見ていきましょう。

1) [=|~|~*|^~|@]

  • = : 次のURLと完全に一致することを意味します
  • ~: 通常の一致を示しますが、大文字と小文字は区別されます
  • ~* : 正規表現マッチング、大文字と小文字を区別しない
  • ^~: は通常の文字の一致を示します。このオプションが一致する場合、このオプションのみが一致し、他のオプションは一致しません。通常はディレクトリの一致に使用されます。
  • @ : "@" は、error_page などの内部ターゲットに使用される名前付き場所を定義します。

上記では、異なる一致ルールを表すいくつかの異なるシンボルが定義されていますが、順序は何でしょうか?

  1. = プレフィックスはこのクエリと完全に一致します。見つかった場合は検索を中止します。
  2. 残りのすべての通常の文字列の中で、最も長い一致。一致の前に ^~ が付いている場合は、検索は停止します。
  3. 構成ファイルで定義された順序での正規表現。
  4. ルール 3 が一致した場合は、その結果が使用されます。それ以外の場合は、ルール 2 の結果が使用されます。

テスト例1:

場所 = /世界 {
 600を返します。
}

場所 = /hello {
 600を返します。
}

場所 ~ /hellowo {
 602を返します。
}

場所 ^~ /hello {
 601を返します。
}

- localhost/world をリクエストすると 600 が返される
- リクエストlocalhost/world2 localhost/test/worldはその他を返します - リクエストlocalhost/helloは600を返します
- localhost/hello/123 へのリクエストは 601 を返します
- localhost/hellow リクエストは 601 を返します
- localhost/hellowo をリクエストすると 601 が返されます
- localhost/test/hellowo をリクエストすると 602 が返されます
- localhost/test/hello リクエストは他の

したがって、次のことがわかります。

  • = は完全一致であり、最も優先度が高いです。
  • 正規表現を照合する場合、~ と ^~ の両方が同時にルールに一致すると、^~ が優先されます。
  • ^~ このルールは、上記の /test/hello など、リクエスト URL の後のパスには一致しません。
  • ^~ は正規表現をサポートしていません。= と比較すると、範囲が広くなります。hellowo は ^~ では一致しますが、= では一致しません。
  • ~は、パスに含まれている限り一致します。たとえば、上記の/test/hellowoは602を返します。

テスト例2:

場所 ~ /hello {
 602を返します。
}

場所 ~ /helloworld {
 601を返します。
}

- localhost/world/helloworld をリクエストすると 602 が返されます
- localhost/helloworld をリクエストすると 602 が返されます

上記の順序を調整します

場所 ~ /helloworld {
 601を返します。
}

場所 ~ /hello {
 602を返します。
}

- localhost/helloworld をリクエストすると 601 が返されます
- localhost/world/helloworld をリクエストすると 601 が返されます
- localhost/helloWorld リクエストは 602 を返します

正規表現が一致すると

  • 最初のマッチは前に置かれたものです
  • 大文字と小文字を区別しない場合は、~*を使用してください。
  • 完全一致を最初に配置してみてください。

テスト例3:

場所 ^~ /hello/ {
 601を返します。
}

場所 /hello/world {
 602を返します。
}

このシナリオでは、一致しないルーティング ルールがありますが、実際のテストはどのようになるのでしょうか。

- http://localhost/hello/wor は 601 を返します
- http://localhost/hello/world は 602 を返します
- http://localhost/hello/world23 は 602 を返します
- http://localhost/hello/world/123 は 602 を返します

上記の例からわかることは

  • 一致しない場合は完全一致が優先されます^~

2) [ウリ]

ここで入力する主なものは、一致する必要があるパスです。前の記号に従って、正確なパスまたは正規表現を入力できます。以下では、主に正規表現について説明します。

  • . : 改行以外の任意の文字に一致します
  • ? : 0回または1回繰り返す
  • + : 1回以上繰り返す
  • * : 0回以上繰り返す
  • \d : 数字に一致
  • ^ : 文字列の先頭に一致します
  • $: 文字列のマッチングの紹介
  • {n} : n回繰り返す
  • {n,}:n回以上繰り返す
  • [c] : 1文字のcにマッチ
  • [az]: 任意の小文字のazに一致します
  • 括弧 () の間に一致する内容は後で $1 によって参照でき、$2 は 2 番目の () の内容を表します。正規表現で混乱を招くのは、\ エスケープ特殊文字です。

ルーティングと転送

リクエスト パスのマッチングは最初のステップにすぎません。マッチングが完了したら、リクエストを他の Web サービスに転送するにはどうすればよいでしょうか。

1. リバースプロキシ

一般的な使用方法は、nginx を使用してリクエストをプロキシし、他の内部 Web サービスに転送することです。

主にprixy_passを通じて達成される

場所 ^~ /webs {
 プロキシパス http://127.0.0.1:8080/webs;
}

上記のルールの意味は、webs で始まるすべてのリクエストをポート 8080 の Web サービスに転送することです。

上記はIPアドレスに直接転送されます。複数のマシンがサービスを提供する場合は、次のように設定できます。

## 最初のアップストリーム層として、http の括弧内に次のコードを入力します。test.online {
 サーバー 120.11.11.11:8080 重み = 1;
 サーバー 120.11.11.12:8080 重み = 1;
}

場所 ^~ /webs {
 proxy_pass http://test.online;
 proxy_redirect デフォルト;
}

2. 書き換えコマンド

書き換え機能は、nginx が提供するグローバル変数または自分で設定した変数を正規表現とフラグと組み合わせて使用​​し、URL の書き換えとリダイレクトを実現します。

rewriteはserver{}、location{}、if{}にのみ配置でき、渡されたパラメータを除くドメイン名の後の文字列に対してのみ機能します。

http://jb51.net/a/we/index.php?id=1&u=str

/a/we/index.php のみを書き換えます。

構文: rewrite regex replacement [flag];

例:

場所 ^~ /hexo {
 ルート '/Users/yihui/GitHub/';
}

場所 ~ /hello {
 ^(/hello).*$ /hexo/public/index.html を最後に書き換えます。
 603を返します。
}

helloで始まるすべてのファイルを/hexo/public/index.htmlに転送します。

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

以下もご興味があるかもしれません:
  • Nginx ロケーションマッチングルールの詳細な説明
  • Nginx の書き換え正規マッチング書き換え方法の例
  • Nginx ロケーション ディレクティブ URI マッチング ルールの詳細な概要
  • nginx を使用して複数の条件を一致させる方法
  • Nginx転送マッチングルールの実装
  • nginx マッチングルールの簡単な概要 (推奨)
  • Nginxのさまざまなマッチング方法の詳細な説明

<<:  mysqldumpデータエクスポートの問題に関する詳細な議論

>>:  MySQL が起動直後にシャットダウンする問題 (ibdata1 ファイルの破損が原因) に対する完璧な解決策

推薦する

テーブル設定の背景画像が100%表示されない解決策

開発中に以下の状況が発見されました。 (1) ファイルが.jspファイル拡張子で保存されている場合、...

HTML テーブル マークアップ チュートリアル (14): テーブル ヘッダー

<br />HTML 言語では、タグを使用してテーブルにタイトルを自動的に追加できます。...

Docker で Elasticsearch Kibana と ik Word Segender をデプロイする詳細な説明

esインストール docker pull elasticsearch:7.4.0 # -d : バッ...

Apache Tika を使用してファイルが破損しているかどうかを検出する方法

Apache Tika は、さまざまな形式のファイルからファイル タイプを検出し、コンテンツを抽出す...

Django プロジェクトを作成して MySQL に接続する方法

1: django-admin.py startproject プロジェクト名2: cd プロジェク...

IE6はmin-widthを実装している

まず第一に、この効果は古い話題であるはずだということはわかっています。今日ファイルを整理していたら、...

Webスキル: 複数のIEバージョンの共存ソリューション IETester

私のおすすめ複数のIEバージョンの共存のためのソリューション以前に IE6、IE7、IE8 の共存に...

CSSでフォントアイコンを使用する方法をお教えします

まず、フォントアイコンとは何でしょうか?表面的にはアイコンですが、実際はテキストです。テキストの設定...

一般的な Dockerfile コマンドの使用方法の紹介

目次01 CM 02 エントリーポイント03 ワークディレクトリ04 環境05 ユーザー06巻07 ...

MySQL UPDATE ステートメントの非標準実装コード

今日は、MySQL データベースと SQL 標準 (および他のデータベース) の UPDATE ステ...

MySql テーブル内の行を削除する実用的な方法

まず、どのフィールドまたはフィールドの組み合わせがデータ行を一意に識別できるかを決定する必要がありま...

MySQL統計データテーブルの設計方法

目次リアルタイム更新は必要ですか?マテリアライズド ビュー ツール (Flexviews)カウントテ...

ウィンドウ環境設定Mysql 5.7.21 windowx64.zip無料インストール版チュートリアル詳細説明

1. 公式サイトのmysqlダウンロードページからmysql-5.7.21-windowx64.zi...

JavaScriptエラーキャプチャの詳細な説明

目次1. 基本的な使い方とロジック2. 特徴3. エラーオブジェクト4. キャッチアンドスロー戦略の...

Navicat For MySQL の使い方に関する簡単なチュートリアル

推薦する: Navicat for MySQL 15 登録とアクティベーションの詳細なチュートリアル...