PHP获取站点URL协议 - http vs https

时间:2010-12-21 19:30:18

标签: php url ssl

我已经编写了一些函数来建立当前的站点URL协议,但我没有SSL,也不知道如何测试它是否在https下工作。 你能告诉我这是否正确吗?

function siteURL()
{
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $domainName = $_SERVER['HTTP_HOST'].'/';
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

是否有必要像上面那样做,或者我可以这样做吗?:

function siteURL()
{
    $protocol = 'http://';
    $domainName = $_SERVER['HTTP_HOST'].'/'
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

在SSL下,即使锚标记网址使用http,服务器也不会自动将网址转换为https?是否有必要检查协议?

谢谢!

18 个答案:

答案 0 :(得分:81)

我知道现在已经很晚了,虽然有一种更方便的方法可以解决这类问题!上面显示的解决方案非常混乱,如果有人应该检查这个,我会怎么做:

$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? 'https://' : 'http://';
如果你不喜欢

,甚至没有条件
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],'/'))).'://';

查看$_SERVER["SERVER_PROTOCOL"]

答案 1 :(得分:67)

不是自动的。你的顶级功能看起来不错。

答案 2 :(得分:60)

这对我有用

if (isset($_SERVER['HTTPS']) &&
    ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
    isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $protocol = 'https://';
}
else {
  $protocol = 'http://';
}

答案 3 :(得分:24)

一些变化:

function siteURL() {
  $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || 
    $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $domainName = $_SERVER['HTTP_HOST'];
  return $protocol.$domainName;
}

答案 4 :(得分:16)

简短的方式

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';

答案 5 :(得分:7)

因为根据我的测试端口号不是一个好习惯,我的解决方案是:

define('HTTPS', isset($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));

HTTPS常量返回TRUE如果$_SERVER['HTTPS']已设置且等于“1”,“true”,“on”或“yes”。 否则返回FALSE。

答案 6 :(得分:6)

对于除IIS以外的任何系统,这足以定义站点自我URL:

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].'/';

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].'/';

取决于您的确切需求: HTTP_HOST vs. SERVER_NAME

答案 7 :(得分:4)

使用此服务器变量获取协议详细信息:

 $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
 echo $scheme; //it gives http:// or https://

请注意,此服务器变量不可靠。有关更多信息,请查看: Is $_SERVER['REQUEST_SCHEME'] reliable?

答案 8 :(得分:4)

如果是代理,$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://" 可能无法提供正确的值,因此这对我有用 -

{{1}}

答案 9 :(得分:2)

$protocal = 'http';
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || $_SERVER['HTTPS'] == 'on') {$protocal = 'https';}


echo $protocal;

答案 10 :(得分:2)

使用 Rid Iculous 的答案制作了一个函数,该答案适用于我的系统。

function site_protocol() {
    if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&  $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')  return $protocol = 'https://'; else return $protocol = 'http://';
}

希望有所帮助

答案 11 :(得分:1)

我测试了most voted answe r并且对我不起作用,我最终使用了:

$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';

答案 12 :(得分:1)

我知道这是一个老问题,但我今天遇到了这个,因为我需要在我的网站上测试这个。看来上面的答案是不必要的复杂。要建立站点协议,您只需要测试$_SERVER['HTTPS']

如果协议使用HTTPS,则$_SERVER['HTTPS']将返回'on'。如果不是,变量将保持为空。 例如:
// test if HTTPS is being used. If it is, the echo will return '$SSL_test: on'. If not HTTPS, '$SSL_test' will remain empty.

$SSL_test = $_SERVER['HTTPS'];

echo '<p>$SSL_test: '.$SSL_test.'</p>';

if($SSL_test == true) {
    echo 'You\'re using SSL';
} else {
    echo 'You\'re not using SSL';
} 

echo '<p>$SSL_test: '.$SSL_test.'</p>'; if($SSL_test == true) { echo 'You\'re using SSL'; } else { echo 'You\'re not using SSL'; } 您可以使用上述内容轻松,干净地测试HTTPS并相应地实施。 :)

答案 13 :(得分:1)

从CodeIgniter中提取:

if ( ! function_exists('is_https'))
{
    /**
     * Is HTTPS?
     *
     * Determines if the application is accessed via an encrypted
     * (HTTPS) connection.
     *
     * @return  bool
     */
    function is_https()
    {
        if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
        {
            return TRUE;
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
        {
            return TRUE;
        }
        elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
        {
            return TRUE;
        }

        return FALSE;
    }
}

答案 14 :(得分:1)

我认为完整的功能应如下所示:

$(document).on('change', '.prc', function() {
  var tSum = 0;
  $('.prc').each(function() {
    tSum += parseFloat($(this).val());
  });
  $('.totalprc').val(tSum);
});

注意:

  • 您还应该查找HTTP_X_FORWARDED_PROTO(例如,如果代理 服务器)
  • 依靠443端口是不安全的(https可以在 另一个端口)
  • REQUEST_SCHEME不可靠

答案 15 :(得分:0)

它是https或http的最佳解决方案:

<?php
$protocol = '//';  
$site_url = $protocol.$_SERVER["HTTP_HOST"];
?>

但无法显示https或http,因此它仅用于链接您的网站内容,如图片等。

如果想要以https重定向您的网站,请在.htaccess文件中添加此代码:

<IfModule mod_rewrite.c>
 RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
 RewriteRule ^(.*)$ https://www.your-domain.com$1 [L]
</IfModule>

使用您的道名更改 www.your-domain.com

答案 16 :(得分:0)

我是这样做的...它是 Rid Iculous的答案的简写 if else版本......

$protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http';

答案 17 :(得分:0)

我知道我参加这个聚会有点晚了,但是如果您不希望不使用$ _SERVER,因为它强烈建议不要使用它,甚至在某些PHP框架上将其停用; ,您有一个Apache Web服务器,因此可以使用其本机命令:-

$protocol = apache_getenv('HTTPS') ? 'https:' : 'http:';