Nginx proxy_pass の / スラッシュによって引き起こされた殺人事件の詳細な説明

Nginx proxy_pass の / スラッシュによって引き起こされた殺人事件の詳細な説明

背景

nginx サーバー モジュールは 2 つのサーバーにプロキシする必要があるため、異なるサーバーを区別して転送するために異なる場所のパスが使用されます。

冒頭にこう書かれていた

位置 / {
   proxy_pass http://server1/;
}

場所 / インデックス {
   proxy_pass http://server2/;
}

しかし、server1 にサービス パス /indexNew があることを忘れていたため、server1 にプロキシされ、404 の問題が発生しました。そこで、緊急に構成を次のように変更しました。

場所 /indexNew {
   proxy_pass http://server1/;
}

位置 / {
   proxy_pass http://server1/;
}

場所 / インデックス {
   proxy_pass http://server2/;
}

問題現象

その結果、リクエストは server1 に到達しますが、エラー メッセージは POST がサポートされていないというものです。

{
	「ステータス」: 500,
	"メッセージ": "http://172.28.72.117/-リクエストメソッド 'POST' はサポートされていません",
	"結果": {}
}

これは、当時アプリケーションから返されたエラーです。nginx をチェックしましたが、エラーはありませんでした。非常に奇妙でした。コードを見ると、/indexNew は確かに POST メソッドであるのに、なぜサポートされていないというエラーが報告されたのでしょうか。

まず、nginx のさまざまな場所の書き込み方法の一致する順序は次のとおりです。

分析する

nginxログにエラーがないので、nginxからアプリケーションへのパケットをキャプチャしてみてください。

tcpdump コマンドを使用してパケットをキャプチャする

tcpdump -w dataAll_normal.pcap -i eth0 -s0 ポート8888

上記のコマンドと同様にパケットをキャプチャし、Wireshark 経由で、/indexNew に関連する http トラフィック パケットがまったく見つからないことがわかります。

次のように場所を変更してみてください

場所 /indexNew {
   proxy_pass http://server1;
}

位置 / {
   proxy_pass http://server1/;
}

場所 / インデックス {
   proxy_pass http://server2/;
}

唯一の違いは、/indexNewのproxy_passの最後のスラッシュ/が削除されていることです。パケットをキャプチャし続けると、/indexNewパケットが検索できることがわかります。

これは変更が正しいことを示します。

エラーを元に戻し、パッケージをキャプチャしようとしますが、/indexNew パッケージを検索できない場合は、IDE を介してアプリケーションをリモート デバッグします。

アプリケーションの URL に /indexNew がなかったため、当然 Wireshark パッケージでも見つけることができませんでした。 。 。

これは、nginx がアプリケーションを転送する場合、アクセス パスが/のみになるためです。

プロジェクト内のリクエストパス/とのインターフェースは、実際にはGETメソッドです

location の proxy_pass の構文を詳しく見てみましょう。確かに次のようになります。proxy_pass の末尾に / があり、一致する場所のパスが削除され、後続の URL PATH が転送用にインターセプトされます。

したがって、proxy_pass の最後の / の意味に注意して慎重に使用する必要があります。これは、100% の情報転送ではなく、パス要求情報を変更します。

Nginx proxy_pass の / スラッシュが原因の悲惨な事件に関するこの記事はこれで終わりです。Nginx proxy_pass スラッシュに関するその他の関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • nginx がドメイン名アクセス用に設定されている場合にドメイン名の後に 2 つのスラッシュ // が表示される問題の解決方法
  • nginx URL にスラッシュと 301 リダイレクトが自動的に追加される問題
  • Nginx サーバーで WordPress パスにスラッシュが自動的に追加されない問題を解決する方法
  • Nginx のバックスラッシュ自動デコード問題の解決方法
  • nginxのスラッシュ(/)の詳しい説明

<<:  フロントエンド開発者は毎日HTMLタグの理解を学ばなければならない(1)

>>:  JSが絵柄デジタル時計を実現

推薦する

type="file" の入力ボックスのスタイル変更の概要

入力タイプ「file」とは何ですか?これが何なのかは説明する必要はないと思います。誰もが知っているこ...

大規模なウェブサイトアーキテクチャを設計・構築する際に考慮すべき10の課題

ここでは、PHP、JSP、または .NET 環境については説明しません。アーキテクチャの観点から問題...

画像内のrarファイルを隠す方法

このロゴを .rar ファイルとしてローカルに保存し、解凍して効果を確認することができます。よりシン...

Tomcatの各ポートの機能の詳細な説明

tomcat 設定ファイルから、tomcat の起動時にデフォルトで 8080 (8443)、800...

HTMLドキュメントタイプの詳細な説明

私のは: <!DOCTYPE html>ブログガーデン: <!DOCTYPE HT...

パスワードログインなしでCentOS7にxshellリモートログインするアイデアを詳しく解説

まず、全体的な考え方についてお話しします。 1. パスワードを使用してCentOSシステムにログイン...

IE10以下のimgタグ問題の解決方法

問題を見つける以前、簡単なデモを書いたのですが、IE10以下では動作しないことがわかりました。ここに...

JavaScript フロー制御 (分岐)

目次1. プロセス制御2. シーケンシャルプロセス制御3. 分岐フロー制御if文1. 支店構造2. ...

MySQL が UNION を使用して 2 つのクエリを接続できない理由の詳細な説明

概要連合接続データセットキーワードは、2つのクエリ結果セットを1つに連結し、同一のレコードを除外する...

Angularコンポーネント投影の詳細な説明

目次概要1. 簡単な例1.サブコンポーネントの<ng-content>ディレクティブを使...

IE7でソースファイルを含むページを開くとページが空白になる問題の解決方法

質問:私のブログのエンコーディングは utf-8 です。ページを開くと空白になっていることもあります...

MySQL 5.7 zip アーカイブ バージョンのインストール チュートリアル

この記事では、MySQL 5.7 zipアーカイブ版のインストールチュートリアルを参考までに紹介しま...

HTML iframe で親ページと子ページ間の双方向メッセージングを実装する例

ある日、リーダーはメイン ページに iframe を埋め込み、親ページと子ページ間で双方向にメッセー...

CentOS 7 でゲートウェイを変更して IP を設定する方法の例

Centos7 バージョンをインストールするときに、外部ネットワークへの接続を選択すると、外部ネット...

MySQL サービスとデータベース管理

目次1. サービスの開始と停止の手順1.1 Windows での MySQL 5.7 の公式 MSI...