7

我的网站有一个 SSL 证书,我正在点击https://mysite.com/info.php,但在 PHP 变量部分 _SERVER["HTTPS"] 没有被报告。我相信这会导致 Drupal 站点出现问题,其中一些 URL 以 https://... 形式写入页面,而另一些则以 http://...

什么决定是否设置了 _SERVER["HTTPS"]?


编辑:这可能是我的问题Detecting HTTPS vs HTTP on server send back nothing有用的问题的答案。可能是负载平衡器问题

4

4 回答 4

10

事实证明,由于负载均衡器处理 SSL 加密/解密,Web 服务器没有得到 $_SERVER["HTTPS"],但 $_SERVER["HTTP_USESSL"] 已设置并可用作闪存SSL 流量。

于 2012-07-26T13:07:21.070 回答
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
}
于 2012-07-25T13:22:32.377 回答
5

在代理/负载均衡器后面

$_SERVER['SERVER_PORT'] 总是 80

$_SERVER["HTTPS"] 和 $_SERVER["HTTP_USESSL"] 为 NULL

我使用了返回 http 或 https 的 $_SERVER['HTTP_X_FORWARDED_PROTO']

于 2016-01-08T11:16:03.967 回答
1

添加到 Arnaud Hallais 的帖子中,我设法在我的本地主机 (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')); 
于 2017-10-30T23:11:40.753 回答