%20%E4%B8%8A%E3%81%AE%E3%80%8C%E3%83%9D%E3%83%BC%E3%83%88%E3%80%8D%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
私は見たリバースプロキシで相対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:8080
Apacheはそれを受け取り、アプリケーションがリッスンするに転送します。- アプリケーションはフォームにリンクがあるファイル(.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 がなくても機能するはずです。