Apache 2.4 で同じサーバーの相対 URL (「サブディレクトリ」) 上の「ポート」アプリケーションをプロキシしますか?

Apache 2.4 で同じサーバーの相対 URL (「サブディレクトリ」) 上の「ポート」アプリケーションをプロキシしますか?

私は見たリバースプロキシで相対URLを正しく処理する方法- しかし、これを理解する(そして自分の問題に適用する)のは非常に困難です。誰かが助けてくれることを願っています。

私のサーバーには、サーバー OS として Ubuntu 20.04 がインストールされているとしますexample.com

次にインストールしますhttps://github.com/hartwork/jawanndennサーバー上で実行します。このアプリケーションは、デフォルトではポート 8080 で実行されます。次のコマンドを実行すると、サーバー自体で実行されていることを確認できます。

wget -O- http://127.0.0.1:8080

ここまでは順調です。今、私がやりたいのは、https://example.com:8080このアプリケーションにアクセスするために にアクセスする代わりに、 にアクセスしたいということですhttps://example.com/jaw。ここでは、通常「サブディレクトリ」と呼びます/jawが、おそらくより正確には相対 URL です。言い換えると、用語を正しく理解していれば、https://example.com/jawは にリバース プロキシすることになりますhttps://example.com:8080

<VirtualHost *:443>そこで、ファイル内の定義内でこれを実行してみました.conf:

  <Location /jaw>
    Options -Multiviews -Indexes
    RewriteEngine On
    ProxyPass         http://127.0.0.1:8080
    ProxyPassReverse  http://127.0.0.1:8080
    SetOutputFilter proxy-html
    ProxyHTMLURLMap http://127.0.0.1:8080
  </Location>
  RewriteRule ^/jaw$ /jaw/ [R]

これは、アプリケーションの開始ページが読み込まれるという意味では機能しますが、大量のリソース (.css、.js) を読み込むことができません。ブラウザでコンソールを開くと、次のような 404 リクエストが多数表示されます。

https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...

したがって、私の推測では、単にロードしたい .js ファイルまたは類似のファイルがあり、/static/...「ポート」アドレスから呼び出されると、それらはマップされ、http://127.0.0.1:8080/static/...すべて正常になります。ただし、プロキシされているため、次のようになります。

  • ブラウザリクエストhttps://example.com/jaw
  • https://example.com:8080Apacheはそれを受け取り、アプリケーションがリッスンするに転送します。
  • アプリケーションはフォームにリンクがあるファイル(.js)を返します。/static/...
  • ブラウザに戻ったら、https://example.com/static/...サーバーへのリクエストとして使用される前に、次のように解釈されます。サーバーはそれらを見つけることができません。

また、上記のスニペット全体を削除し<Location><VirtualHost *:443>ノード内でこれを使用してみました。

  ProxyPass /jaw/ http://127.0.0.1:6789/
  ProxyPassReverse /jaw/ http://127.0.0.1:6789/

以前とまったく同じことが起こります。最初のページが読み込まれ、他のすべてのリソースが参照されているように見えます/static/...が、すべて 404 です。

最後に、上記のステートメントも削除し、次のステートメントを使用しました。

  ProxyPass /jaw/  http://127.0.0.1:8080
  ProxyHTMLURLMap http://127.0.0.1:8080  /jaw
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

これはまったく同じ動作です (最初のページが読み込まれ、リソースが失敗します)。ただし、リソースはブラウザ コンソールに次のようにリストされます。

https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...

... 502 プロキシ エラーで失敗します。何らかの書き換えは行われましたが、まだ何かがおかしいようです。

そこで私の質問は、Apacheにプロキシをどう伝えるかということですすべて127.0.0.1:8080 のアプリケーションから、「サブディレクトリ」として表示されるもの (相対 URL? ここでは/jaw) に移動しますか?


編集: 結局、502 プロキシ エラーの原因は次のとおりでした:

AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js

... 明らかにスラッシュが欠落しています。そのため、次のようになりました。

  ProxyPass /jaw/  http://127.0.0.1:8080/
  ProxyHTMLURLMap http://127.0.0.1:8080/  /jaw/
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

... 実際にはほとんどの部分(リソース)で動作しますが、これでは処理されない/static呼び出しがあります...したがって、プロキシをどのように行うかは(私にとって)まだ未解決の問題です。/dataすべて

答え1

バックエンド サーバーを正しいベース URL で構成します。これは、プロキシで強制的に書き換えるよりもはるかに簡単です。

設定は である必要がありますJAWANNDENN_URL_PREFIX。 に設定するだけ/jawで、すべての URL が適切に生成されます。

最初の例は、ProxyHTMLURLMap と OutputFilter がなくても機能するはずです。

関連情報