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が絵柄デジタル時計を実現

推薦する

MySQLでANDとORを組み合わせる問題を解決する

以下のように表示されます。 SELECT prod_name,prod_price FROM pro...

年末ですが、MySQL パスワードは安全ですか?

序文:年末です。データベースを検査する時期ではないでしょうか?一般的に、検査では、パスワードの複雑さ...

HTML 5.1 学習: 14 の新機能とアプリケーション例

序文ご存知のとおり、HTML5 はインターネット コミュニティ全体に標準を提供する組織である Wor...

Dockerはクロスプラットフォーム機能を実現するためにnet5プログラムを導入

展開環境: ここでは docker コンテナ、Linux システム、VmWare 仮想マシンが使用さ...

MySQLデータベースインデックスの詳細な説明

目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...

Vueにログイン認証傍受機能を設置するアイデアを詳しく解説

目次1. 解決策2. サーバーから返されたトークンをブラウザに保存する3. リクエストにアクセス権限...

Ajax jQueryはページ上のdivの更新効果を実現します

元のコードは次のとおりです。 <div class='コントロールグループ'&...

Vue でユーザー権限に基づいてルートを動的に追加する方法

ユーザーの権限に応じて異なるメニュー ページを表示します。知識ポイントルートガード(事前ガードを使用...

Centos サーバーに MySql をデプロイし、Navicat に接続するプロセスの詳細な説明

(1)サーバー構成: [root@localhost ~]# cd /usr/local/src/ ...

2つのLinuxサーバー間でファイルとフォルダを転送する手順

今日、私はプロジェクトの移行の問題に取り組んでいましたが、突然、大量の写真をどうやって移動したらよい...

TypeScript でオブジェクト キーの値の範囲を制限する方法

TypeScript を使用する場合、TypeScript が提供する型システムを使用してコードのあ...

Nodejs エラー処理プロセス記録

この記事では、接続エラー ECONNREFUSED を例に、Node.js がエラーを処理するプロセ...

Vueカスタムコンポーネントはイベント修飾子を使用してピットレコードを踏む

序文今日、自作のコンポーネントを使っていたところ、突然、長い間忘れていたバブリングイベントに遭遇しま...

Vue の this.$router と this.$route の違いと push() メソッド

公式文書には次のように記されている。ルーターを挿入することで、どのコンポーネントでも this.$r...

WeChatアプレットはシンプルな計算機を実装する

WeChatアプレットの簡単な計算機は参考用です。具体的な内容は次のとおりです。 1. はじめに1....