我的网站有一个SSL证书,我正在点击https://mysite.com/info.php,但在PHP变量部分下,没有报告_SERVER [“HTTPS”]。我相信这会导致Drupal网站出现问题,其中一些URL正在以https:// ...的形式写入页面,而其他URL则被写为http:// ...
是什么决定是否设置了_SERVER [“HTTPS”]?
编辑:这可能是我的问题Detecting HTTPS vs HTTP on server sending back nothing useful的答案。可能是负载均衡器问题
答案 0 :(得分:10)
事实证明,由于处理SSL加密/解密的Load Balancer,Web服务器没有获得$ _SERVER [“HTTPS”],但是设置了$ _SERVER [“HTTP_USESSL”]并且可以用作SSL流量的闪存。
答案 1 :(得分:7)
它在文档$_SERVER['HTTPS']
Set to a non-empty value if the script was queried through the HTTPS protocol.
所以
function checkHTTPS() {
if(!empty($_SERVER['HTTPS']))
if($_SERVER['HTTPS'] !== 'off')
return true; //https
else
return false; //http
else
if($_SERVER['SERVER_PORT'] == 443)
return true; //https
else
return false; //http
}
答案 2 :(得分:4)
代理/负载均衡器背后
$ _ SERVER ['SERVER_PORT']总是80
$ _ SERVER [“HTTPS”]和$ _SERVER [“HTTP_USESSL”]为NULL
我使用$ _SERVER ['HTTP_X_FORWARDED_PROTO']返回http或https
答案 3 :(得分:1)
添加到Arnaud Hallais'发布,我设法在我的localhost(apache / mac),测试服务器(apache / linux)和生产站点(iis / win)上获得正确协议的唯一方法是:
define("PROTOCOL", isset($_SERVER['HTTP_X_FORWARDED_PROTO']) ? $_SERVER['HTTP_X_FORWARDED_PROTO'] : ((isset( $_SERVER["HTTPS"] ) && strtolower( $_SERVER["HTTPS"] ) == "on" ) ? 'https' : 'http'));