我使用nginx作为负载平衡器,后面是Apache应用服务器。由于SSL连接在负载平衡器处终止,因此$ b b $ b $ _ SERVER ['HTTPS'] $ b
找到一个安全的方式来检测应用服务器上的HTTPS。
到目前为止,我把它放到我的CakePHP配置中:
$ request_headers = getallheaders();
if((isset($ _ SERVER ['HTTPS'])&& $ _SERVER ['HTTPS'])||(isset($ request_headers ['X-Forwarded-Proto'])&& $ request_headers ['X-Forwarded-Proto'] =='https')){$ ssl = true;
//覆盖环境vars(ugly),因为CakePHP不会支持X-Forwarded-Proto$ _SERVER ['HTTPS'] ='on';
$ _ENV ['HTTPS'] ='on';
} else {
$ ssl = false;
}
然后在nginx配置中,我使用了 proxy_set_header X-Forwarded-Proto https; 将标记添加到负载均衡器和后端应用程序服务器之间的任何请求。
这完全正常,但任何人直接请求应用程序服务器可能会欺骗他们认为他们正在浏览SSL,当他们不是。我不知道这是否是一个安全风险,但它似乎不是一个好主意。
这是一个安全风险吗?
因为使用 X-Forwarded-Proto 看起来像标准的标准,解决方案可能是一个很好的补丁提交给CakePHP核心,所以我认为任何答案都可以合法地涉及编辑核心文件。
解决方案:
mod_rpaf 会让你这样做。
这会设定Apache的HTTPS值到“on”基于nginx发送的头,所以Cake将开箱即用(以及Apache中运行的任何其他应用程序)。
它还会更正REMOTE_ADDR,SERVER_PORT和HTTP_HOST的值。
这是我的示例config:
< IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_ProxyIPs 127.0.0.1 10.0.0.0/24
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
< / IfModule>
#如果mod_rewrite重定向,那么我们失去HTTPS状态为REDIRECT_HTTPS。
#这将重置它。这发生在Cake的前台控制器
< IfModule setenvif_module>
SetEnvIf REDIRECT_HTTPS on HTTPS = on
< / IfModule>