nginx リバース プロキシの魔法のスラッシュについての簡単な説明

nginx リバース プロキシの魔法のスラッシュについての簡単な説明

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

場合位置プロキシパス結果
1 /フー/ http://192.168.1.48/ /api
2 / フーhttp://192.168.1.48/ //API
3 /フー/ http://192.168.1.48 /foo/api
4 / フーhttp://192.168.1.48 /foo/api

表2

場合位置プロキシパス結果
5 /フー/ http://192.168.1.48/バー/ /バー/api
6 / フーhttp://192.168.1.48/バー/ /バー//api
7 /フー/ http://192.168.1.48/バー/バラピ
8 / フーhttp://192.168.1.48/バー/バー/api

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 を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx 7層リバースプロキシと負荷分散についての簡単な説明
  • Kibanaのログイン認証機能を実装するためのNginxリバースプロキシの詳細説明
  • Nginx ダイナミック DNS リバース プロキシの書き方をいくつか詳しく説明します
  • Nginx を Node.js のリバース プロキシとして使用する方法
  • Nginx リバースプロキシのセカンダリドメイン名のバインド方法と注意事項
  • CentOS で nginx リバース プロキシに基づく負荷分散を実装する方法
  • nginx httpsリバースプロキシtomcatを実装する2つの方法
  • Nginx リバース プロキシを介して IP アクセス転送を実装するためのサンプル コード
  • PHPはNginxを使用してリバースプロキシを実装します
  • Nginx リバース プロキシとキャッシュおよびキャッシュのクリア方法

<<:  MySQLデーモンの起動に失敗したエラーの解決方法

>>:  Mysql 5.7.17 をインストールした後、MySQL にログインするチュートリアル

推薦する

MySQL の一般的な問題とアプリケーション スキルの概要

序文MySQL の日常的な開発やメンテナンスでは、パスワードの紛失やテーブルの破損など、避けられない...

element.style インライン スタイルを変更する方法のチュートリアル

序文上記の Web ページ スタイルを記述しているときに、スタイルの値をどのように変更しても、ページ...

JavaScriptのURLオブジェクトとは何かについて話しましょう

目次概要ハッシュプロパティホストプロパティホスト名属性Href属性起源のプロパティユーザー名とパスワ...

html ページ!--[IE の場合]...![endif]--使用方法の詳細な紹介

コードをコピーコードは次のとおりです。 <!--[IEの場合]><script t...

Hadoop 2.Xの新機能、ごみ箱機能の説明

ごみ箱機能をオンにすると、削除されたファイルの元のデータをタイムアウトなしで復元できるため、誤って削...

シンプルなプログレスバーを作成するための HTML+CSS

1. HTMLコードコードをコピーコードは次のとおりです。経験値: <span class=...

ウェブページレイアウトデザインのシンプルな原則

この記事では、Web ページ レイアウト デザインのいくつかの簡単な原則をまとめ、Web ページ デ...

MySQL 内部結合の使用例 (必読)

文法規則 列名を選択 テーブル名1から INNER JOIN テーブル名2 ON テーブル名1.列名...

HTML ハイパーリンク内の中国語文字化けの分析と解決

Vm 内のハイパーリンク URL は、Get 要求のパラメータとして中国語と連結する必要があります。...

HTMLページ間で値を渡す問題の解決策

初めてこのエッセイを使ったとき、私はかなりぎこちなく感じましたhtmlファイルコードをコピーコードは...

vue cli3は環境ごとにパッケージ化の手順を実装します

cli3 でビルドされた vue プロジェクトは、ゼロ構成ファイルとして知られています。パッケージ化...

Apache ab を使用して HTTP パフォーマンス テストを実行する

MacにはApache環境が付属していますターミナルを開き、sudo apachectl -v と入...

MySQL の concat 関数についての簡単な説明。MySQL でフィールドの前または後に文字列を追加する方法

MySQL で concat 関数を使用する方法: CONCAT(文字列1、文字列2、…)戻り値は、...

Nginxドメイン名転送のhttpsアクセスの実装

事前に一言:突然、複数のドメイン名のアクセスを https に転送するというタスクを受け取りました。...

.htaccess を使用して特定の IP からの Web サイトへのアクセスを禁止する方法

序文コストを考慮して、ほとんどのウェブマスターは、多数の小規模なウェブサイト用にサーバーを個別に購入...