我正在使用以下配置进行设置
负载均衡器 -> Apache Web 服务器(2) -> 部署在 tomcat 上的应用程序(集群 5 个节点)
在部署的应用程序中,我们确实有一些需要使用 HTTPS 模式访问的安全部分,我们正在尝试通过在负载均衡器级别安装 SSL 证书来使用 SSL 卸载。
以下是 Apache 服务器配置 Listen 80
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/html/
ServerName prod.mysite.com
LogLevel warn
ErrorLog logs/prod.mysite.com-error_log
CustomLog logs/prod.mysite.com-access_log common
Include conf/sf.conf
</VirtualHost>
配置文件
ProxyPass /favicon.ico !
ProxyErrorOverride On
ProxyStatus On
ProxyRequests Off
ProxyBadHeader Ignore
ProxyPass / balancer://cluster/
ProxyPassReverse / balancer://cluster/
<Proxy balancer://cluster>
BalancerMember ajp://xxx.xx.xx.xx:48009 route=node1 keepalive=On ping=3 retry=3
BalancerMember ajp://xxx.xx.xx.xx:48009 route=node2 keepalive=On ping=3 retry=3
BalancerMember ajp://xxx.xx.xx.xx:48009 route=node3 keepalive=On ping=3 retry=3
ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=300 nofailover=On
</Proxy>
其余配置都是非常标准的 Apache 配置,SSL 证书已在负载均衡上正确安装。
当我以 HTTP 模式打开我的应用程序时,一切运行正常,但是当应用程序尝试重定向到 SSL 模式(https 页面)时,我收到无限重定向错误。
我检查了日志文件,似乎底层应用程序正在将客户端重定向到 HTTPS 模式,而 Apache Web 服务器再次以 HTTP 形式发送请求,这导致无限重定向。
我不确定我哪里做错了或者哪个流程部分配置不正确。
有人能帮助我了解根本原因吗
答案1
根本原因是,当负载平衡器执行 SSL 时,即使客户端使用 SSL,对站点安全部分的所有请求都将以 HTTP 形式到达。负载平衡器会删除 SSL 包装器,请求将以普通 HTTP 请求形式到达 apache,并再次重定向到 SSL,从而导致重定向无限循环。
解决方案是根据x-forwarded-proto
大多数负载均衡器添加到请求的标头进行重定向,以解决这个确切的问题。
即是否x-forwarded-proto=http
重定向到 HTTPS 或是否x-forwarded-proto=https
继续正常
看https://stackoverflow.com/questions/26620670/apache-httpx-forwarded-proto-in-htaccess-is-causing-redirect-loop-in-dev-envir关于如何在您的站点.htaccess
文件中执行此操作,但稍微谷歌一下就会找到在其他平台和语言上执行此操作的方法。