NGINX - URL を保持したままリクエストを別の IP にリダイレクトする

NGINX - URL を保持したままリクエストを別の IP にリダイレクトする

ダイナミック DNS をセットアップして、自宅の外からさまざまなコンピューターにアクセスできるようにしたいと考えています。現在、192.168.1.2 で nginx を実行している Raspberry Pi があり、ルーターは 192.168.1.1 にあります。また、ルーターから Raspberry Pi にポート 80 を転送しているので、ダイナミック DNS URL を押すだけで、Pi のランディング ページに phpinfo() ページが表示されます。

mydns.com/device1次に、内部的に他のデバイスにリダイレクトしながら、その URL を維持できるようにしたいと考えています。

つまり、 が表示されますhttp://mydns.com/device1が、内部的には にアクセスしますhttp://192.168.1.3。さらに、 と入力すると、mydns.com/device1/login内部的に にリダイレクトされますhttp://192.168.1.3/login

次のように使用しようとしていますsub_filter:

sub_filter_once off;
sub_filter_types text/html;
sub_filter ""http://192.168.1.3" "http://192.168.1.2"
proxy_pass http://192.168.1.3/;
proxy_set_header Host $host;

これはある程度は機能しますが、完全ではありません。パスはリダイレクトされません (例: サブフォルダー内のファイル)。例:

これ欲しい: http://mydns.com/device1/style/basic.css

しかし、これを見てみましょう: http://mydns.com/style/basic.css

これにより、Chrome のコンソール ビューで確認できるように 404 が発生します。次のエラーが発生します:

Failed to load resource: the server responded with a status of 404 (Not Found)

これはパス上にあります:http://mydns.com/style/basic.cssただし、が必要ですhttp://mydns.com/device1/style/basic.css

アドレスバーに「.」と入力すると CSS ファイルにアクセスできるので、http://mydns.com/device1/style/basic.cssアクセス可能であることはわかりますが、NGINX でこれらのフォルダーを転送/書き換えることができません。

誰か助けてくれませんか?ありがとう

答え1

これにはいくつかの理由が考えられます:

  • proxy_pass を使用して場所に入る前に、何かが URI を書き換えるか、
  • または、以前に処理されたいくつかの場所で一致するサブ URI として提供されます。
  • または (nginx のバージョンによります) proxy_pass ディレクティブの IP の後のスラッシュ/により、nginx はスラッシュをプロキシ URI として受け取り、送信前に書き換えます。

全体の設定を見なければ、あなたの側で何が起こっているのか正確にはわかりません。または、デバッグ ログを有効にして (原因を確認する) みることもできます。

とにかく、上記の理由に関連して、それを解決するには 3 つの方法があります。

  • 書き換えを避けるか、rewrite ... breakproxy_pass の前に追加して URI を拡張する必要があります。
  • proxy_pass http://192.168.1.3/device1/;または、のように定義したり、 のような何らかの (マッピング) 変数を使用したりproxy_pass http://192.168.1.3/$device/;、 のような完全な元の URI を使用して定義したりすることもできますproxy_pass http://192.168.1.3$request_uri;(ここには がないことに注意してください/)。
  • proxy_pass http://192.168.1.3;または、末尾のスラッシュを削除して、 (スラッシュあり) ではなくproxy_pass http://192.168.1.3**/**;(スラッシュなし) にすることもできます
    。この場合、「元のリクエストが処理されるときにクライアントから送信されたのと同じ形式でリクエスト URI がサーバーに渡される」(書き換えが行われない場合)、または「変更された URI を処理するときに、完全に正規化されたリクエスト URI が渡される」(書き換えがいくつか発生した場合、またはエイリアス付きの中間の場所がいくつかありtry_files ... @proxy渡された場合) ことになります。

を見てみましょうプロキシパスproxy_pass の使用に関するすべての可能なバリエーションのドキュメント。

関連情報