PHP Get Site URL Protocol - http vs https

2022-08-30 06:18:49

我已经编写了一个小函数来建立当前的站点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 下,即使锚点标签 url 使用的是 http,服务器也不会自动将 url 转换为 https 吗?是否有必要检查协议?

谢谢!


答案 1

这对我有用

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://';
}

答案 2

我知道已经很晚了,尽管有一种更方便的方法来解决这类问题!其他解决方案非常混乱;这就是我这样做的方式:

$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === 0 ? 'https://' : 'http://';

...或者如果您愿意,甚至可以无条件:

$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],'/'))).'://';

看看 $_SERVER[“SERVER_PROTOCOL”]


推荐