使用中间的 Apache 代理重写 302 应用服务器重定向 URL

使用中间的 Apache 代理重写 302 应用服务器重定向 URL

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

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/。

有时,应用服务器希望重定向请求的路径。例如,将 /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

我尝试使用反向代理密码,但还没能弄清楚如何强制它用 https 而不是 http 重写 302 重定向 URL。

有什么想法吗?

答案1

我总是花几个小时思考一个问题,然后才放弃并发布一个问题——结果却在发布问题几分钟后就解决了我自己的问题……

对于那些感兴趣的人,解决方案是不是使用反向代理密码,而是使用标头指令 - 它允许您处理出站标头。在本例中,我可以捕获 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

答案2

我找到了另一种选择。

基于https://stackoverflow.com/questions/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

相关内容