Apache 反向代理在重定向后跳回不安全协议

Apache 反向代理在重定向后跳回不安全协议

我安装了一个反向代理 apache 服务器,用于处理 tomcat 的 SSL 加密。我们有一个 struts web 应用程序,每次使用时response.sendRedirect(),应用程序都会回退到正常的 HTTP 协议,而不是停留在 HTTPS。应用程序必须使用两种协议运行,我无法处理 tomcat 容器上的 SSL。

我可以使用 HTTPS 并通过链接和操作进行导航。但如果我执行使用重定向的操作,则只能使用 HTTP。为什么会这样?

SSLProxyEngine [off|on] # (Differs between the ssl and the other normal conf)
ProxyPreserveHost On
ProxyPass / http://mysite:1234/
ProxyPassReverse / http://mysite:1234/

这是我的配置。我考虑过在 SSL 配置中切换http为,但这会导致以下结果:https

错误的网关

代理服务器从上游服务器收到无效响应。此外,尝试使用 ErrorDocument 处理请求时遇到 502 Bad Gateway 错误。

我如何才能使重定向坚持 HTTPS?

答案1

如果 sendRedirect 使用相对路径,Tomcat 将添加绝对元素,包括方案(http/https)和服务器名称。

除非您覆盖它,否则 Scheme 将默认为 http。服务器名称将来自您已仔细传递的主机标头。

我遇到了同样的问题,并在单独的端口上使用了新的 Tomcat 连接器(与现有的连接器一起),该连接器覆盖了方案并设置了端口以获得良好的效果:

<Connector port="8443" protocol="HTTP/1.1" URIEncoding="UTF-8"
                    connectionTimeout="20000"
                    scheme="https" proxyPort="443"/>

然后在Apache中,SSL虚拟主机具有:

ProxyPass / http://<tomcat_server>:8443/

普通 HTTP 虚拟主机继续使用现有的 Connector 端口 (8080)

或者,您可以在调用 sendRedirect() 时对重定向位置进行硬编码,但这显然不灵活。

答案2

我只需在 Apache 服务器配置中添加以下 ProxyPassReverse 指令即可解决此问题:

ProxyPassReverse / http://<apacheserver>:<httpsport>/

相关内容