私のサーバーのポート 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
ProxyPassReverse
HTTP ヘッダー (例: 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 をオーバーライドする方法のタグ。