Apache2 仮想ホスト リバース プロキシ アセット リンクの書き換え

Apache2 仮想ホスト リバース プロキシ アセット リンクの書き換え

私のサーバーのポート 8080 で Web アプリケーションが実行されています: myip:8080/app

私のhttpd.confには次の設定があります

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass /app http://localhost:8080/app/
 ProxyPassReverse /app http://localhost:8080/app/
</VirtualHost>

これは正常に動作し、アプリはsubdomain.mydomain.com/appで利用可能になります。

今、subdomain.mydomain.com(/appなし)で利用できるようにするのに苦労しています。最初に試したのは

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
</VirtualHost>

そしてまた付け加えた

ProxyHTMLURLMap /app/ /

しかし、どちらも機能していないようです。メイン ページは読み込まれますが、すべての JavaScript および CSS リンクは依然として /app/... を指しており、アセットではなくメインの HTML ページが返されます。

何が足りないのでしょうか? 正しい方向に進んでいるのでしょうか、それともこれを実現するまったく別の (より良い) 方法があるのでしょうか?

このアプリケーションは、Ubuntu 12.04 上の Tomcat 7 の Tapestry Web アプリケーションです。

パフォーマンスに関する洞察も興味深いでしょう。

答え1

ProxyPassReverseHTTP ヘッダー (例: 301 リダイレクト) でのみ機能します。

HTML 書き換えを有効にするには、次の手順で有効にする必要があります。

ProxyHTMLEnable On
ProxyHTMLURLMap /app/ /

ただし、最新の Web アプリケーションでは、リバース プロキシによって行われた HTTP 要求から何が起こっているかを簡単に理解できるため、この場合、プロキシ レベルでの追加調整は通常必要ありません。

mod_proxy_htmlこれらのリクエストを処理する際には、いくらかのオーバーヘッドが追加されることに注意してください。

答え2

ジョバンニの答えは私を正しい方向に導いてくれました。

ProxyHTMLEnable On

またはより正確には(私のバージョンのmod_proxy_htmlの場合)同等の

SetOutputFilter INFLATE;proxy-html;DEFLATE

しかし、私はこれを書き換えと組み合わせて使用​​することにしました (他の方法では Tapestry イベント リンクを動作させることができなかったため)。

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyRequests Off
 ProxyPreserveHost On
 SetOutputFilter INFLATE;proxy-html;DEFLATE     
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
 ProxyHTMLURLMap /app/ /     
 ProxyPassReverseCookiePath /app /
 RewriteEngine on
 RewriteRule ^/app/(.+) /$1 [R,L]
</VirtualHost>

ProxyPassReverseCookiePath /app /また、Tomcat セッション クッキーが機能するように、クッキー パス ( ) を調整する必要がありました。

答え3

の Web アプリケーションには、 でmyip:8080/app始まる HTML および JS の絶対パスが多数含まれている可能性がありますが、/app/...これらはすべて でキャッチして書き換えることはできませんmod_proxy_html

まず、 などの別のローカル URL でアプリを実行してみることをお勧めしますmyip:8080/blah。ブラウザの開発者ツール バーを起動し、ネットワーク タブでまだ で要求されているファイルを確認し/app/...、両方の URL (/blah と /app) で動作するまで修正します。

目標は、アプリ内のすべてのリンクが相対的であること、つまり次のように指定することです。

<script type="text/javascript" src="file.js"></script>

このようなものの代わりに

<script type="text/javascript" src="/app/file.js"></script>

こちらもご覧ください<base>デフォルトのベース URL をオーバーライドする方法のタグ。

関連情報