Php 如何确定您是否';在没有$#u服务器的情况下重新使用HTTPS[';HTTPS';]

Php 如何确定您是否';在没有$#u服务器的情况下重新使用HTTPS[';HTTPS';],php,https,Php,Https,我在网上看过很多教程,上面说如果服务器连接使用HTTPS进行保护,则需要检查$\u SERVER['HTTPS']。我的问题是,在我使用的一些服务器上,$\u SERVER['HTTPS']是一个未定义的变量,会导致错误。是否有另一个变量我可以检查,应该始终定义 为了清楚起见,我目前正在使用此代码来解析它是否为HTTPS连接: if(isset($_SERVER['HTTPS'])) { if ($_SERVER['HTTPS'] == "on") { $secure_c

我在网上看过很多教程,上面说如果服务器连接使用HTTPS进行保护,则需要检查
$\u SERVER['HTTPS']
。我的问题是,在我使用的一些服务器上,
$\u SERVER['HTTPS']
是一个未定义的变量,会导致错误。是否有另一个变量我可以检查,应该始终定义

为了清楚起见,我目前正在使用此代码来解析它是否为HTTPS连接:

if(isset($_SERVER['HTTPS'])) {
    if ($_SERVER['HTTPS'] == "on") {
        $secure_connection = true;
    }
}

您可以检查
$\u SERVER['SERVER\u PORT']
,因为SSL通常在端口443上运行,但这不是万无一失的。

Chacha,根据PHP文档:“如果通过HTTPS协议查询脚本,则将其设置为非空值。”因此,在许多情况下,如果HTTPS确实打开,则if语句将返回false。您需要验证
$\u服务器['HTTPS']
是否存在并且是否为非空。如果给定服务器的HTTPS设置不正确,您可以尝试检查
$\u server['server\u PORT']==443

但请注意,一些服务器也会将
$\u SERVER['HTTPS']
设置为非空值,因此一定要检查此变量

参考:

根据hobodave的帖子:“如果通过HTTPS协议查询脚本,则设置为非空值。”


即使未定义
$\u服务器['HTTPS']
时,此选项也应始终有效:

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}
该代码与IIS兼容

从:

1) 如果通过HTTPS协议查询脚本,则设置为非空值

if (!empty($_SERVER['HTTPS']))
{
    $secure_connection = true;
}
2) 请注意,在IIS中使用ISAPI时,如果请求不是通过HTTPS协议发出的,则该值将为“off”。(IIS7运行PHP作为快速CGI应用程序的情况也有报道)

此外,Apache1.x服务器(以及损坏的安装)可能没有定义
$\u SERVER['HTTPS']
,即使连接安全。虽然不能保证,但端口443上的连接可能使用额外的端口检查


附加说明:如果客户端和服务器之间存在负载平衡器,则此代码不会测试客户端和负载平衡器之间的连接,而是测试负载平衡器和服务器之间的连接。要测试前一个连接,您必须使用HTTP_X_FORWARDED_PROTO头进行测试,但这要复杂得多;请参见下面的答案。

真正的答案:准备好复制粘贴到[config]脚本中了

/*配置设置;X=2011年5月10日编辑*/
$pv_sslport=443;/*因为这可能是不同的,加布里埃尔·索萨也说过*/
$pv_服务器端口=80;/*X*/
$pv_servername=“mysite.com”;/*X*/
/*迈克尔·科平斯基更正后追加的X*/
如果(!isset($_服务器[“服务器名称”])| |!$_服务器[“服务器名称”]){
如果(!isset($\u ENV[“服务器名称”])){
getenv(“服务器名称”);
//设置为环境服务器名称
$\u服务器[“服务器名称”]=$\u环境[“服务器名称”];
}
}
如果(!$\u服务器[“服务器名称”])(
/*X服务器名称仍然为空?…您可以设置$\u服务器[“服务器名称”]=$pv\u服务器名称*/
}
如果(!isset($_服务器[“服务器\端口])| |!$_服务器[“服务器\端口”])){
如果(!isset($\u ENV[“服务器\u端口”])){
getenv(“服务器_端口”);
$\服务器[“服务器\端口”]=$\环境[“服务器\端口”];
}
}
如果(!$\服务器[“服务器\端口”])(
/*X服务器端口仍然为空?…您可以设置$\u服务器[“服务器端口”]=$pv\u服务器端口*/
}
$pv|u URIprotocol=isset($|u SERVER[“HTTPS”])?($|u SERVER[“HTTPS”]====”on“|$$| u SERVER[“SERVER|u PORT”]====”pv|u sslport)?“HTTPS://“:”http:/”($| u SERVER[“SERVER|u PORT”=====”pv u sslport)?“HTTPS:/”:“http:/”;

$pv\u URIprotocol
现在是正确的,可以使用;示例
$site=$pv\u URIprotocol.$\u SERVER[“SERVER\u NAME”]
。当然,字符串也可以替换为TRUE和FALSE。PV代表PortalPress变量,因为它是一种直接复制粘贴,可以一直工作。这一部分可以在生产脚本中使用。

我刚刚遇到一个问题,我使用Apache mod\u ssl运行服务器,但使用了phpinfo()和var\u dump($\u服务器)显示PHP仍然认为我在端口80上

这是我为有相同问题的人提供的解决方法

<VirtualHost *:443>
  SetEnv HTTPS on
  DocumentRoot /var/www/vhost/scratch/content
  ServerName scratch.example.com
</VirtualHost>

SetEnv HTTPS on
DocumentRoot/var/www/vhost/scratch/content
ServerName scratch.example.com

值得注意的一行是SetEnv行。有了SetEnv行,在重新启动后,您应该拥有您一直梦想的HTTPS环境变量。我认为添加端口不是一个好主意,特别是当您有许多具有不同版本的服务器时。这只是增加了另一件需要记住更改的事情。查看doc的我认为Kaiser的最后一行非常好,因此:

if(!empty($_SERVER["HTTPS"]))
  if($_SERVER["HTTPS"]!=="off")
    return 1; //https
  else
    return 0; //http
else
  return 0; //http

似乎已经足够完美了。

唯一可靠的方法是Igor M描述的方法

$pv_URIprotocol = isset($_SERVER["HTTPS"]) ? (($_SERVER["HTTPS"]==="on" || $_SERVER["HTTPS"]===1 || $_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://") :  (($_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://");
考虑以下几点: 您将nginx与fastcgi一起使用,默认情况下(debian、ubuntu)fastgi_params contain指令:

fastcgi_参数HTTPS$HTTPS

如果您不使用SSL,它将被转换为空值,而不是“off”,而不是0 你注定要失败

我的解决方案(因为标准条件[$\u SERVER['HTTPS']=='on']在负载平衡器后面的服务器上不起作用)是:

HTTP_X_FORWARDED_PROTO:用于识别HTTP请求的原始协议的事实标准,因为反向代理(负载平衡器)可以使用HTTP与web服务器通信,即使对反向代理的请求是HTTPS

我发现这些参数也可以接受,而且在切换web服务器时很可能没有误报

  • $\u服务器['HTTPS\u密钥大小']
  • $\u服务器['HTTPS\u SECRETKEYSIZE']
  • $\u服务器['HTTPS\u服务器\u发卡机构']
  • $\u服务器['HTTPS\u服务器\u主题']

    if($_SERVER['HTTPS_KEYSIZE'] != NULL){/*do foobar*/}
    

  • 我使用的最短路径:

    $secure_connection = !empty($_SERVER['HTTPS']);
    

    如果使用https,则$secure\u connection为true。

    这是一个我已经使用了一段时间的可重用函数。HTH

    $secure_connection = !empty($_SERVER['HTTPS']);
    
    /**
     * Determine if this is a secure HTTPS connection
     * 
     * @return  bool    True if it is a secure HTTPS connection, otherwise false.
     */
    function isSSL()
    {
        if (isset($_SERVER['HTTPS'])) {
            if ($_SERVER['HTTPS'] == 1) {
                return true;
            } elseif ($_SERVER['HTTPS'] == 'on') {
                return true;
            }
        } elseif ($_SERVER['SERVER_PORT'] == HTTPS_PORT) {
            return true;
        }
    
        return false;
    }
    
    if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
        $scheme = 'https';
    else
        $scheme = 'http';
    
    RewriteEngine on
    
    RewriteCond %{HTTPS} =on [NC] 
    RewriteRule .* - [E=HTTPS:on,NE]
    
    HTTPS : 1
    
    HTTPS : 1, on
    
    if( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 ){
        //enable secure connection
    }
    
    $_SERVER["REQUEST_SCHEME"]
    
    $secure_connection = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || (!empty($_SERVER['HTTP_HTTPS']) && $_SERVER['HTTP_HTTPS'] != 'off') || $_SERVER['REQUEST_SCHEME'] == 'https' || $_SERVER['SERVER_PORT'] == 443) ? true : false;
    
    proxy_set_header   X-HTTPS 1;
    
    function isSSL() {
    
        $https = filter_input(INPUT_SERVER, 'HTTPS');
        $port = filter_input(INPUT_SERVER, 'SERVER_PORT');
        if ($https) {
    
            if ($https == 1) {
                return true;
            } elseif ($https == 'on') {
                return true;
            }
        } elseif ($port == '443') {
            return true;
        }
    
        return false;
    }
    
    public static function isHttps()
    {
        if (array_key_exists("HTTPS", $_SERVER) && 'on' === $_SERVER["HTTPS"]) {
            return true;
        }
        if (array_key_exists("SERVER_PORT", $_SERVER) && 443 === (int)$_SERVER["SERVER_PORT"]) {
            return true;
        }
        if (array_key_exists("HTTP_X_FORWARDED_SSL", $_SERVER) && 'on' === $_SERVER["HTTP_X_FORWARDED_SSL"]) {
            return true;
        }
        if (array_key_exists("HTTP_X_FORWARDED_PROTO", $_SERVER) && 'https' === $_SERVER["HTTP_X_FORWARDED_PROTO"]) {
            return true;
        }
        return false;
    }
    
    function hasSSL($url) 
    {
        // take the URL down to the domain name
        $domain = parse_url($url, PHP_URL_HOST);
        $ch = curl_init('https://' . $domain);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); //its a  HEAD
        curl_setopt($ch, CURLOPT_NOBODY, true);          // no body
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  // in case of redirects
        curl_setopt($ch, CURLOPT_VERBOSE, 0); //turn on if debugging
        curl_setopt($ch, CURLOPT_HEADER, 1);     //head only wanted
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);    // we dont want to wait forever
        curl_exec($ch);
        $header = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($header === 200) {
            return true;
        }
        return false;
    }
    
    $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0 ||
            !empty($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
                strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0;
    
    return ($https) ? 'https://' : 'http://';
    
    if( ($_SERVER['HTTPS'] ?? 'off') == 'off' ) {
        // redirect
    }
    
    <?php
    echo "<br>1 ".$_SERVER["HTTPS"];
    echo "<br>2 ".$_SERVER["SERVER_PORT"];
    echo "<br>3 ".$_SERVER["HTTP_X_FORWARDED_PROTO"];
    echo "<br>4 ".$_SERVER["HTTP_X_FORWARDED_SSL"];
    echo "<br>5 ".$_SERVER["HTTP_HTTPS"];
    echo "<br>6 ".$_SERVER["REQUEST_SCHEME"];
    ?>
    
    <html>
    <body>
    <br>
    Just cruising
    </body>
    </html>
    
    function is_ssl(){
    if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO']=="https"){ return true; }
    elseif(isset($_SERVER['HTTPS'])){ return true; }
    elseif($_SERVER['SERVER_PORT'] == 443){ return true; }
    else{ return false; }
    }
    
    if(is_ssl()){
    // WHAT TO DO IF IT IS SSL / HTTPS
    }else{
    // WHAT TO DO IF IT IS NOT SSL / HTTPS
    }
    
    $isSsl = false; 
        if (isset($_SERVER['HTTP_CF_VISITOR'])) {
            $cfDecode = json_decode($_SERVER['HTTP_CF_VISITOR']);
            if (!empty($cfDecode) && !empty($cfDecode->scheme) && $cfDecode->scheme == 'https') {
                $isSsl = true;
            }
        }
    var_dump($isSsl);