我已经根据需要在Tomcat8.5和OpenJDK1.8上安装了pentaho(9.x)。在它前面是带有mod_proxy_http的Apache2.4。
我的网站使用https服务,我有以下代理规则:
RequestHeader set X-Forwarded-Proto "https"
ProxyPreserveHost on
ProxyPass "/pentaho" "http://tomcat_host_ip:8080/pentaho"
ProxyPassReverse "/pentaho" "http://tomcat_host_ip:8080/pentaho"
ProxyPass "/pentaho/" "http://tomcat_host_ip:8080/pentaho/"
ProxyPassReverse "/pentaho/" "http://tomcat_host_ip:8080/pentaho/"
ProxyPass "/pentaho/Login" "http://tomcat_host_ip:8080/pentaho/Login"
ProxyPassReverse "/pentaho/Login" "http://tomcat_host_ip:8080/pentaho/Login"
当我尝试登录时,在发布过程中出现错误:https://pentaho.mywebsite.org/pentaho/j_spring_security_check
应用程序尝试使用http协议而不是https进行响应。
在请求头中,我有正确的referer和origin:origin:https://pentaho.mywebsite.org 推荐人:https://pentaho.mywebsite.org/pentaho/login
但是响应头使用http而不是https:location进行回复http://pentaho.mywebsite.org/pentaho/
2条答案
按热度按时间qjp7pelc1#
我只需将proxyport=“443”和scheme=“https”添加到tomcat中的http连接器中,就解决了这个问题。
规则
在apache上是无用的。这是我正确的apache配置
这是我的tomcat http连接器
lqfhib0f2#
servlet应用程序使用
scheme
,serverName
及serverPort
a的性质ServletRequest
生成超链接。通常,tomcat从Host
请求标头,而scheme
取决于连接器。如果使用反向代理,上述逻辑可能不够。您有两种解决方案:
静态设置方案
在您的情况下,代理使用https,而tomcat使用http,因此您必须覆盖
scheme
及secure
特性:而apache http服务器配置可以缩短为:
请注意,在你的回答中,你没有设置
secure
属性:此属性决定传输是否机密。如果未将其设置为true,tomcat将自动将浏览器重定向到redirectPort
每当应用程序要求保密传输时(参见保护web应用程序)。只有当您的代理仅将https请求转发给tomcat时,此解决方案才能正常工作。
动态设置方案
如果将http和https请求转发给tomcat,服务器需要一种区分它们的方法。因此,您需要添加一个
RemoteIpValve
到您的tomcat配置:并要求ApacheHTTP服务器添加
X-Forwarded-Proto
标题:此解决方案还具有设置客户端
remoteHost
及remoteAddr
而不是那些代理。