我安装了一个反向代理 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>/