web-dev-qa-db-ja.com

nginxリバースプロキシの背後にあるサーバーは、URLの相対パスを無視します

私のタイトルは最高ではありません、ウェブスタッフの私の知識は非常に基本的です、ごめんなさい。

達成したいこと

私は1つのボックスを持っていますfanbox Archlinuxでnginxを実行しており、リバースプロキシ機能を介してインターネットからホームLANへのメインエントリポイントとして使用しています(つまり、ポート80と443にしかアクセスできない作業)。変更するドメイン名を使用しますが、これを制御することはできず、今のところhome.netと呼びます。

fanboxポート80と443がhome.netにマップされているので、その部分は簡単でした。

ファイアウォールの背後に2つのWebサーバーがありますweb1.lanweb2.lanweb2ilo.lan。これらは両方とも、標準のURLを介してLAN上で直接アクセスできるさまざまなアプリケーション(異なるマシンで同じ名前を持つ場合があります)を備えています(名前は例として示されています。コンテンツを制御することはできません)。

http://web1.lan/phpAdmin/
http://web1.lan/gallery/
http://web2.lan/phpAdmin/
http://web2.lan/dlna/

...等々...

さてweb2ilo.lanは特別なケースです。これは、HPサーバーの帯域外管理Webインターフェイスですweb2.lan。その特定のWebサーバーは1つのアプリケーションしか提供しないため、ルートURLを介してのみアクセスできます。

http://web2ilo/login.html 

私の目標は、次のようにhome.netのサブパスを介してこれらにアクセスすることです。

http://home.net/web1/phpAdmin/
http://home.net/web1/gallery/
http://home.net/web2/phpAdmin/
http://home.net/web2/dlna/
http://home.net/web2ilo/login.html

私の問題

これはほぼ機能しますが、WebアプリケーションはURLを書き換える傾向があるため、ログイン後にそれぞれ次のようになります。

http://home.net/web1/phpAdmin/login.php
http://home.net/web2ilo/login.html

ブラウザはそれぞれにリダイレクトされます

http://home.net/phpAdmin/index.php
http://home.net/index.html 

相対サブパスweb1およびweb2iloがなくなっていることに注意してください。これにより、論理的に404が得られます。

私の設定

これまで、私は多くのことを検索し、何をしているかをあまり理解せずにnginxで多くのオプションを試しました。これがこの問題を再現する私の設定です。わかりやすくするためにSSLは省略しました。

   server {
      listen       443 ssl;
      server_name  localhost;

      # SSL stuff left out for clarity 

      location / {
          root   /usr/share/nginx/html;
          index  index.html index.htm;
      }

      location /web1/ {
              proxy_set_header Host $Host;
              proxy_redirect off;
              proxy_pass https://web1.lan/;
      }


      location /web2/ {
              proxy_set_header Host $Host;
              proxy_redirect off;
              proxy_pass https://web2.lan/;
      }

      location /web2ilo/ {
              proxy_set_header Host $Host;
              proxy_redirect off;
              proxy_pass https://web2ilo.lan/;
      }

  }

最初の回答の後

最初の数回の回答(ありがとう!)の後、私のセットアップは一般的ではなく、一人でトラブルに向かっている可能性があることに気付きました。

それでは、フロントエンドのポートやドメイン/ホスト名に触れることなく、ファイアウォールの背後にあるWebサーバーにアクセスするためのより良いアイデアは何でしょうか。

9
FLBzh

設定proxy_redirectを使用して、「バックエンド」サーバー応答ヘッダー(場所と更新)を適切なフロントエンドURLに変更する必要があることをnginxに通知することを検討してください。 default設定を使用してnginxがlocationおよびproxy_passディレクティブから適切な値を計算できるようにするか、以下のようにマッピングを明示的に指定できます。

proxy_redirect http://web1.lan/ /web1/

参照: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

注:これは応答ヘッダーにのみ影響します。HTMLコンテンツ内のリンクやJavascriptには影響しません。

コンテンツまたはJavascriptのリンクで問題が発生した場合は、バックエンドサーバー上のコンテンツを変更するか(指定した場合は不可能な場合があります)、フロントエンドパスがバックエンドと同じになるようにプロキシソリューションを調整できます。 1つ(たとえば、http://frontend/web1/phpAdminではなく、単にhttp://frontend/phpAdminがあります)。これには、アプリケーションごとにlocationディレクティブを追加する必要があります。

location /phpAdmin/ {
     proxy_set_header Host $Host;
     proxy_redirect off;
     proxy_pass https://web1.lan/phpAdmin/;
}         
1
Jason Musgrove