web-dev-qa-db-ja.com

8080ポートのTomcat上のアプリケーションへのApacheリバースプロキシが応答ヘッダーに間違ったURLを与える

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に挿入されないようにするにはどうすればよいですか?
誰かがこれを手伝ってくれる?ありがとう。

2
Mahadev Sawale

ProxyPassReverseを以下のように更新します。

     ProxyPassReverse /myapp http://ext-domain/myapp

参照: http://httpd.Apache.org/docs/2.2/mod/mod_proxy_ajp.html#usage

2
skonka

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はバックエンドによって生成されます
  • Apacheは、ProxyPassReverse xxx http://ext-domain:8080/appの構成をチェックします
  • 一致する場合、ApacheはHTTP 302 xxx/fooを続行します(このステップはあなたの場合は発生しません
  • xxxが完全なURLでない場合は、通常のServerNameなどで展開されます(したがって、ProxyPassReverse /app42 ...の完全な意味は、Apacheが302 http://ext-domain/app42と言うことです)
  • Apacheは、ブラウザーがApacheのポート80と通信することも認識しているため、誤って構成されたServerNameで明示的に指示しない限り、ブラウザーを8080に誤って転送することはありません。
1
kubanczyk