web-dev-qa-db-ja.com

途中でApache Proxyを使用して302 App Server ReDirect URLを書き換える

私は奇妙なセットアップをしています。次のようになります。

Browser ----------> HTTPs Proxy ------> Apache HTTP -----> Tomcat AJP
           HTTPS                 HTTP                AJP

HTTPSプロキシ(非常にばかばかしいプロキシ)では、URLはhttps://proxy.domain.com/appのようになります。次に、http://Apache.domain.com/app(ホストproxy.domain.comを渡す)のように、HTTPを使用してApacheにトンネリングされます。 Apacheは、AJPプロトコルを使用してローカルでajp:// localhost:8009/app /にリクエストをトンネルします。

アプリサーバーがリクエストされたパスをリダイレクトしたい場合があります。たとえば、/ app /を/ app/webappにリダイレクトします。したがって、パスをリダイレクトする302をApacheに送り返します-おそらくajp:// localhost:8009/app/webappのようなものです。次に、ApacheはリダイレクトURLをhttp://proxy.domain.com/app/webappに書き換えます。 HTTPSプロキシはダムなので、リダイレクトを分析してhttpをhttpsに変更しません。

したがって、ユーザーをhttpsに送信するために302リダイレクトURLを書き換えるようにApacheを構成できるかどうかを考えたいと思います。

これは、Apacheのhttps.confでこれまでに設定したものです。

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app

ProxyPassReverseを使用してみましたが、302リダイレクトURLをhttpではなくhttpsで強制的に書き換える方法を理解できていません。

何かご意見は?

8
George

私はいつも何時間も問題に取り組み、質問をあきらめて投稿します-投稿してから数分後に自分の問題を解決します...

興味がある人にとっての解決策はnotを使用することですProxyPassReverseを使用するのではなく、Headerディレクティブを使用することで、送信ヘッダーを混乱させることができます。この場合、Locationレスポンスヘッダーをキャプチャして正規表現を実行し、URLのプロトコルを修正できます。

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app
Header edit Location ^http(\:\/\/proxy.*)$ https$1

出来上がり!

Apacheが文句を言うなら、それはmod_headersがまだ有効になっていない可能性があります:a2enmod headers

9
George

別のオプションを見つけました。

に基づいていますhttps://stackoverflow.com/questions/5741210/handling-x-forwarded-proto-in-Java-Apache-Tomcat and Apache ReverseProxyPassがhttpsではなくhttpにredrects 一部のサーバーはX-Forwarded-Protocolヘッダーを認識しているようです。以下を追加することで、Tomcatにそれを認識させることができます。

<Valve className="org.Apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwarded-protocol" />

server.xml

3
wodny