为什么_SERVER [“HTTPS”]设置为1?

时间:2012-07-25 13:19:19

标签: php apache webserver

我的网站有一个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的答案。可能是负载均衡器问题

4 个答案:

答案 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'));