私は奇妙なセットアップをしています。次のようになります。
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で強制的に書き換える方法を理解できていません。
何かご意見は?
私はいつも何時間も問題に取り組み、質問をあきらめて投稿します-投稿してから数分後に自分の問題を解決します...
興味がある人にとっての解決策は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
別のオプションを見つけました。
に基づいています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
。