nginx リバース プロキシを設定する場合、location と proxy_pass のスラッシュによってさまざまな問題が発生する可能性があります。スラッシュが 1 つ多いか少ないかによって、結果がまったく異なります。そのため、location と proxy_pass の後にスラッシュがある場合とない場合を特別に整理して組み合わせ、完全なテストを実施して原理を解明し、姿勢レベルを向上させました。 0. 環境情報 2台のnginxサーバー nginxA: 192.168.1.48 nginxB: 192.168.1.56 1. 試験方法 nginx A で異なるルールを設定し、nginx A にリクエストします: http://192.168.1.48/foo/api ログの$requestフィールドを表示して、nginx Bが受信したリクエストを観察します。 2. テストのプロセスと結果 ケース1 nginx A 構成: 場所 /foo/ { プロキシパス http://192.168.1.56/; } nginx B が受信したリクエスト: /api ケース2 nginx A 構成: 場所 /foo/ { プロキシパス http://192.168.1.56/; } nginx B が受信したリクエスト: //api ケース3 nginx A 構成: 場所 /foo/ { プロキシパス http://192.168.1.56/; } nginx B が受信したリクエスト: /foo/api ケース4 nginx A 構成: 場所 /foo/ { プロキシパス http://192.168.1.56/; } nginx B が受信したリクエスト: /foo/api ケース5 nginx A 構成: 場所 /foo/ { プロキシパス http://192.168.1.56/bar/; } nginx B が受信したリクエスト: /bar/api ケース6 nginx A 構成: 場所 /foo { プロキシパス http://192.168.1.56/bar/; } nginx B が受信したリクエスト: /bar//api ケース7 nginx A 構成: 場所 /foo/ { プロキシパス http://192.168.1.56/bar; } nginx B が受信したリクエスト: /barapi ケース8 nginx A 構成: 場所 /foo { プロキシパス http://192.168.1.56/bar; } nginx B が受信したリクエスト: /bar/api これを見て目が回りませんか?実はパターンがあるんです。 これらのケースを表に並べると、結果はnginx Bが受信したリクエストを示します。 表1
表2
3. 分析 元のリクエストパス: この記事では「/foo/api」と同じ名前を使用します 場所: 上記の表の場所の列 proxy_pass: 上記の表のproxy_pass列 新しいリクエストパス: nginxが元のリクエストパスを処理した後の文字列 proxy_passの分析に焦点を当てます。proxy_passは3つの形式に分けられます。 そして、文字列の後にip:portが続くかどうかによって、2つのカテゴリに分類されます。「/」も文字列なので、1は1つのカテゴリに分類され、2と3は1つのカテゴリに分類されます。以下では、この2つのカテゴリについて説明します。 proxy_pass ip:port の後に文字列が続かない場合、ケース 3 および 4 のように、nginx は元のリクエスト パスをそのまま次の nginx に転送します。 proxy_pass の ip:port の後に文字列が追加されると、nginx は元のリクエスト パスから場所を削除し、残りの文字列を proxy_pass に連結して新しいリクエスト パスを生成し、新しいリクエスト パスを次のステーション nginx に転送します (上記の状況は、削除された文字列が空の文字列であることを除いて、実際にはこれと同じです~~) 最も混乱しやすい例、ケース 7 を見てみましょう。 proxy_pass の ip:port の後に文字列 "/bar" が続くため、場所 "/foo/" は元のリクエスト パス "/foo/api" から削除され、"api" になります。次に、"api" が proxy_pass: http://192.168.1.48/bar に連結され、新しいリクエスト URL "http://192.168.1.48/barapi" が生成されます。そのため、次の段階で nginx が受信するリクエストは "/barapi" になります。 ケース 6: proxy_pass の ip:port の後に文字列 "/bar/" が続くため、location: "/foo" は元のリクエスト パス "/foo/api" から削除されて "/api" になり、その後 "/api" が proxy_pass: http://192.168.1.48/bar/ に連結されて新しいリクエスト パス "http://192.168.1.48/bar//api" が生成されます。そのため、次の段階で nginx が受信するリクエストは /bar//api になります。 同じことが他のケースにも当てはまります。これでようやく理解できましたし、もう混乱する必要もありません。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: Mysql 5.7.17 をインストールした後、MySQL にログインするチュートリアル
序文:この記事は、CUDA 9.0 をインストールした経験に基づいています。CUDA 9.0 は現在...
Dockerイメージのインポートとエクスポートこの記事では、移行、バックアップ、アップグレードなどの...
iPadなどのモバイル端末の普及により、人々がモバイル端末で読書に費やす時間はますます長くなり、読...
目次1. はじめに2. es5メソッド3. 非同期関数のシリアル実行4. 非同期関数の並列実行5. ...
質問から始めましょう5 年前、私が Tencent にいたとき、ページング シナリオでは MySQL...
このブログでは、Docker をインストールするプロセスを簡単な手順で説明します。Docker のイ...
docker リポジトリ自体は非常に遅いですが、中国の Alibaba Cloud ミラー リポジト...
目次単項演算子ブール演算子乗算演算子加法演算子関係演算子等価演算子条件演算子代入演算子カンマ演算子要...
最近、MySQL オンラインでいくつかのデータ異常が発生しましたが、すべて早朝に発生しました。ビジネ...
序文開発プロセスにおいて、変数の定義は非常に頻繁かつ基本的なタスクです。変数の使用シナリオと範囲に応...
1 ダウンロードして準備するまず、公式ウェブサイトからTomcatをダウンロードする必要があります。...
適用シナリオ:新しい要件の 1 つはアンケート調査を行うことですが、必然的に多くの質問が含まれ、1 ...
今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...
ラベル表示モード(重要) divタグとspanタグ1. スタイルはまったく同じですが、ラベルが異なり...
ウェブページの自動更新: <head></head> の間に次のコードを追加...