使用中间的Apache Proxy重写302 App Server重定向URL


8

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

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

在HTTPS代理(一个非常笨的代理)上,出现了一个类似于https://proxy.domain.com/app的URL。然后使用HTTP像http://apache.domain.com/app一样将其通过隧道传输到Apache(传入主机proxy.domain.com)。然后,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。

因此,我想弄清楚是否可以配置Apache重新编写302重定向URL,以将用户发送到https。

这是我到目前为止在Apache的https.conf中拥有的配置:

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

我尝试使用ProxyPassReverse,但无法弄清楚如何强制使用https而不是http重写302重定向URL。

有什么想法吗?

Answers:


9

在放弃并发布问题之前,我总是要花几个小时才能解决问题-只是在发布后几分钟解决我自己的问题...

对于那些感兴趣的人,解决方案不是使用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


无需编辑标题,请使用@wondy解决方案,以通过RempteIpValve使Tomcat知道LB / RProxy协议
Muhammad Hewedy 2015年

我用了这个解决方案。我更喜欢做一些Apache配置,而不是让tomcat做我想要的!
froderik

3

我找到了另一个选择。

基于/programming/5741210/handling-x-forwarded-proto-in-java-apache-tomcatApache ReverseProxyPass重定向到http而不是https,似乎有些服务器可以识别X-Forwarded-Protocol标头。通过添加以下内容,可以使Tomcat识别它:

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

server.xml


1
这是最好的解决方案,因此,Tomcat是设计成这样的工作
穆罕默德Hewedy

我想你的意思是X-Forwarded-Proto
迈克尔·汉普顿

我很确定我已经使用了“协议”并且它有效。但是那是2013年3月。我可以看到两个版本都使用了一段时间。如我所见,与此同时,新的RFC 7239已编写(2014年6月)。可能“ Proto”版本已经赢得并且是现在的标准。
wodny
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.