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無料インストール版のパスワード設定に関する詳細なチュートリアル

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...

使用場所によって混乱しやすいXHTMLタグ

<br />jb51.net では、常に記事のセマンティクスを重視してきましたが、HTM...

ホスト上のDockerコンテナ内でシェルまたはプログラムを実行する

Docker コンテナに繰り返し入って操作することを避けるために、コンテナ内の一連の命令をホストマシ...

JavaScript に関する 6 つの奇妙で便利な点

目次1. 解体のヒント2. デジタルセパレーター3. try...catch...finally が...

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

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

HTML要素を非表示にするいくつかの方法

1. CSSを使用するコードをコピーコードは次のとおりです。スタイル="display:n...

JavaScript 関数はランダムな色の検証コードをカプセル化します (完全なコード)

数字、文字、またはランダムな色の数字と文字の混合で構成される n 桁の確認コード。以下に完全なコード...

WeChat アプレットの日付と時刻のコンポーネント (年、月、日、時間、分)

この記事の例では、WeChatアプレットの日付と時刻コンポーネントの具体的なコードを参考までに共有し...

CentOS 7.4 に MySQL 5.7 を手動でインストールする方法

MySQL データベースは、特に JAVA プログラマーの間で広く使用されています。クラウド データ...

プレフィックスケースを削除する Nginx リバース プロキシ構成のチュートリアル

nginx をリバース プロキシとして使用する場合、リクエストをそのまま次のサービスに転送するだけで...

JavaScript でドラッグ可能なプログレスバーを実装する

この記事では、ドラッグ可能なプログレスバーを実装するためのJavaScriptの具体的なコードを参考...

Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

この記事では、Element-uiを使用してvue.jsでナビゲーションメニューを実装するための具体...

Centos7.5 構成 Java 環境のインストール Tomcat の説明

Tomcat は Java 言語をベースにした Web サーバー ソフトウェアです。この記事では主に...

Linuxでテキスト比較を実現するコツを教えます

序文コードを書く過程で、必然的にコードに何らかの変更を加えることになります。しかし、変更を加えるとき...

show processlist コマンドによる MySQL パフォーマンス検査の説明

show processlist コマンドは非常に便利です。MySQL の実行が 50% 以上になる...