nginx の場所に複数の Proxy_pass メソッドがある

nginx の場所に複数の Proxy_pass メソッドがある

1. まず、nginxの位置情報に関する関連知識を確認しましょう

1) 位置マッチング手順:

  • ~ #波線は通常の一致を示し、大文字と小文字が区別されます
  • ~* # は大文字と小文字を区別せずに通常の一致を実行することを示します
  • ^~ #^~ は、通常の一致ではなく、一般的な文字の一致を示します。このオプションが一致する場合、このオプションのみが一致し、他のオプションは一致しません。通常、ディレクトリの一致に使用されます。
  • = # 共通文字の完全一致を実行します
  • @ #"@" は、error_page、try_files などの内部ターゲットに使用される名前付き場所を定義します。

2) 場所のマッチングの優先順位(設定ファイル内の場所の順序に関係なく)

1.= 完全一致が最初に処理されます。完全一致が見つかった場合、nginx はそれ以上の一致の検索を停止します。
2. 通常の文字マッチング、正規表現ルール、長いブロックルールはクエリマッチングよりも優先されます。つまり、項目が一致する場合、正規表現の一致とより長い一致があるかどうかも確認する必要があります。
3.^~ このルールのみが一致し、nginx は他の一致の検索を停止します。それ以外の場合、nginx は他の場所の指示の処理を続行します。
4. 最後に、「~」と「~*」を含む命令が一致します。対応する一致が見つかった場合、nginx は他の一致の検索を停止します。正規表現がない場合、または正規表現が一致しない場合は、一致度が最も高い逐語的一致命令が使用されます。

2. nginx の複数の if 内の Proxy_pass:

サーバー{
127.0.0.1:80 を聴く;
    $test A を設定します。 
  
    $testB を B に設定します。
    位置 / {
      ($test ~* "A") の場合 { 
         proxy_pass http://www.so.com; 
         壊す; 
      } 
      ($testB ~* "B") の場合 { 
         proxy_pass http://www.sogou.com; 
         #壊す; 
      } 
    }
}

特定の条件が満たされたときに特定の proxy_pass を使用したいと考えています。ただし、上記の例のように、複数の if 文が満たされる場合、最初の if 文に break がない場合、以下が実行されます。最初の一致後に proxy_pass を実行するには、break を追加できます。 (nginxにはif elseのような命令はないようです)

3. 異なる proxy_pass のパラメータを決定します。

Rewrite はパラメータではなく URL パスでのみ一致できるため、パラメータ判定を実装する場合は $arg_parameter を使用する必要があります。

位置 / {
    ルートhtml;
    インデックス index.html index.htm index.php;
    proxy_redirect オフ;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header ホスト $http_host;
    プロキシ_http_バージョン 1.1;
    proxy_set_header 接続 "";

    $query_string が "usg=0" の場合
      proxy_pass http://local_workera;
    }

    $query_string が "usg=1" の場合
      proxy_pass http://local_workerb;
    }

    $arg_uid が "(.*[AB]$)" の場合
  proxy_pass http://local_workerf;
    }

    proxy_pass http://local_workera;
}

1) リクエスト パス内の 2 つのパラメータ usg=0 と usg=1 は固定されているため、通常のマッチングには $query_string が使用されます ($query_string の値はリクエスト内のすべてのパラメータです)

2) 次に、uid 値が A または B で終わるリクエストを local_workerf に転送して処理したい場合、この時点では通常のマッチングに $query_string を使用することはできません (/?uid=1A&t=1&usg=1 と /?uid=123&t=A&usg=0 をマッチングさせることは容易ではないため)。この時点では通常のマッチングに $arg_uid のみを使用できます。

3) 2 つのパラメータ usg=0 と usg=2 は相互に排他的であるため、上記の場所にある if 命令のロジックに従って、中断することなく正しく処理され、先頭に配置されます。 uid のマッチングでは、usg と競合するため、一番下に配置するか、改行を追加することしかできません。つまり、次のようになります。

位置 / {
    ルートhtml;
    インデックス index.html index.htm index.php;
    proxy_redirect オフ;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header ホスト $http_host;
    プロキシ_http_バージョン 1.1;
    proxy_set_header 接続 "";
 
 $arg_uid が "(.*[AB]$)" の場合
  proxy_pass http://local_workerf;
  壊す;
    }

    $query_string が "usg=0" の場合
      proxy_pass http://local_workera;
    }

    $query_string が "usg=1" の場合
      proxy_pass http://local_workerb;
    }

    proxy_pass http://local_workera;
}

nginx location の複数の if における proxy_pass メソッドに関するこの記事はこれで終わりです。より関連性の高い nginx location proxy_pass コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • nginx における proxy_pass のさまざまな使用法の詳細な説明
  • Nginx の場所と proxy_pass パスの設定の問題の概要
  • nginx proxy_pass 設定で URL が / で終わる場合と / なしで終わる場合の違いの詳細な説明
  • nginx リバース プロキシでの proxy_pass の実装
  • nginx の 2 つのモジュールの proxy_pass の違い

<<:  カスタムポップアップボックスを実装するためのJavaScriptシングルトンモード

>>:  altとtitleの違いの詳しい説明

推薦する

Docker 経由で Redis 6.x クラスターをデプロイする方法

システム環境: Redis バージョン: 6.0.8 Docker バージョン: 19.03.12シ...

IIS7~IIS8.5 サーバープロトコルヘッダーの削除または変更

要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...

js でオブジェクトとオブジェクト メソッドを作成するいくつかの方法の詳細な説明

この記事は、JS レッドブックの第 8 章に記載されているオブジェクトに関する 2 番目の記事です。...

独自のネイティブ JavaScript ルーターを作成する方法

目次序文導入JavaScript 履歴 API独自のネイティブJSルーティングを実装するHistor...

WeChatアプレット認証ログインを処理するエレガントな方法

序文WeChat ミニプログラム プロジェクトでユーザー情報を取得し、ユーザー ログインを実装する場...

VueはElementUIのフォームサンプルコードを模倣する

実装要件ElementUI を模倣したフォームは、インデックス コンポーネント、Form フォーム ...

Nginxサービス500:内部サーバーエラーの原因の1つ

500 (内部サーバー エラー) サーバーでエラーが発生したため、要求を完了できませんでした。 50...

MySQLで数千万のテストデータを素早く作成する方法

述べる:この記事で扱うデータ量は 100 万です。数千万のデータが必要な場合は、量を増やすだけで済み...

Vue ルーティング this.route.push ジャンプ ページが更新されない場合の解決策

Vue ルーティング this.route.push ジャンプ ページが更新されない1. 背景概要:...

HTML ページ適応幅テーブル

WEB アプリケーションのページでは、テーブルがよく使用されます。列の数が限られているため、各列のコ...

Docker 入門インストールチュートリアル (初心者版)

ドクター紹介: Docker はコンテナ関連の技術です。簡単に言うと、さまざまなソフトウェアを実行で...

Docker Consul の概要とクラスター環境構築手順(グラフィカルな説明)

目次1. Dockerコンサルの概要2. nginxとconsulをベースにした自動検出と高可用性の...

Vue.js スロットにおけるスコープ付きスロットの使用法の詳細な説明

目次スロットなしVue2.x スロットスロット付き名前付きスロットスロット属性なしスロットの簡単なサ...

TypeScript ジェネリックを簡単に説明する方法

目次概要ジェネリック医薬品とはビルドシステムジェネリック医薬品の一般的な理解ジェネリッククラスジェネ...