8080ポートのTomcat(6)で実行されているアプリケーションへのリバースプロキシ用に、以下の構成のApache(2.2)サーバーがあります。
....
ServerName ext-domain
ProxyPreserveHost On
ProxyPass /myapp http://int-domain:8080/myapp
ProxyPassReverse /myapp http://int-domain:8080/myapp
....
ブラウザから以下のURLにアクセスした場合
"http://ext-domain/myapp"
ブラウザのアドレスバーでURLが置き換えられます。
"http://ext-domain:8080/myapp"
そして、Apacheアクセスログには...
"GET /myapp HTTP/1.1" 302 421 "-" "Mozilla/5.0"...
このポート8080が応答URLに挿入されないようにするにはどうすればよいですか?
誰かがこれを手伝ってくれる?ありがとう。
ProxyPassReverseを以下のように更新します。
ProxyPassReverse /myapp http://ext-domain/myapp
参照: http://httpd.Apache.org/docs/2.2/mod/mod_proxy_ajp.html#usage
OK、古い答えは不完全です。 原因は次のとおりです:ProxyPreserveHost on。この句はほとんど必要ありません。
したがって、初期構成テンプレートは次のようになります。
....
ServerName ext-domain
ProxyPass /app http://int-domain:8080/myapp
ProxyPassReverse /app http://int-domain:8080/myapp
....
驚愕する302応答が生成されますバックエンドによって。バックエンドにヘッダーHost: ext-domain
を伝えましたが、これはProxyPreserveHost
の効果であるため、バックエンドは素晴らしく従順であり、302リダイレクトを提供する必要がある場合は、同じext-domain
利便性として。 Backedは、接続したポートを認識しているため、convenienceと同じポートを使用しようとします。都合が悪い場合は、そもそもProxyPreserveHost
を使用しないでください。これは、問題に対する最もクリーンで混乱の少ないソリューションです。ほとんどのアプリケーション(すべてではありません)はProxyPreserveHost
を必要としませんが、通常のX-Forwaded-xxx
ヘッダーを使用します。
302の処理はおおよそ次のようになります。
HTTP 302 http://ext-domain:8080/app/foo
はバックエンドによって生成されますProxyPassReverse xxx http://ext-domain:8080/app
の構成をチェックしますHTTP 302 xxx/foo
を続行します(このステップはあなたの場合は発生しません)ServerName
などで展開されます(したがって、ProxyPassReverse /app42 ...
の完全な意味は、Apacheが302 http://ext-domain/app42
と言うことです)ServerName
で明示的に指示しない限り、ブラウザーを8080に誤って転送することはありません。