在中间使用Apache Proxy重写302 App ServerredirectURL

我有一个奇怪的设置。 它看起来像这样:

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

在HTTPS代理(非常愚蠢的代理)上,URL看起来像https://proxy.domain.com/app。 然后通过http传输到Apache,就像http://apache.domain.com/app(通过主机proxy.domain.com传递)一样。 然后,Apache使用AJP协议在本地将请求隧道到ajp:// localhost:8009 / app /。

有时应用程序服务器要redirect请求的path。 例如,redirect/ app / to / app / webapp。 所以,它发送一个302回到Apacheredirectpath – 可能是像ajp:// localhost:8009 / app / webapp。 然后,Apache将redirectURL重写为http://proxy.domain.com/app/webapp。 HTTPS代理是愚蠢的,所以它不分析redirect并将http更改为https。

所以,我想知道是否可以configurationApache来重写302redirectURL来将用户发送到https。

这里是我在Apache的https.conf中的configuration:

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

我尝试使用ProxyPassReverse ,但一直没有能够找出如何强迫它重写302redirectURL与https而不是http。

有什么想法吗?

在放弃和发布一个问题之前,我总是用几个小时的时间来解决问题 – 只是在发布之后几分钟内解决我自己的问题。

对于那些感兴趣的人,解决scheme是使用ProxyPassReverse ,而是使用Header指令 – 它让你搞砸出站头。 在这种情况下,我可以捕获位置响应头并在其上运行正则expression式来修复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

我find了另一个select。

基于https://stackoverflow.com/questions/5741210/handling-x-forwarded-proto-in-java-apache-tomcat和Apache ReverseProxyPass redrects到http而不是https似乎有些服务器识别X-Forwarded-Protocol头。 人们可以通过添加:

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

server.xml