PHP https检查灵活的ssl(cloudflare),该怎么办?

dec*_*cay 12 php ssl https cloudflare

背景:网站(example.com),dns通过cloudflare pro计划设置,这提供了"灵活的ssl"(在这里阅读),这意味着ssl只存在于客户端和cloudflare之间,而不是cloudflare和服务器之间,因此不需要专用的ip和不需要在服务器上进行特殊设置.服务器设置为不使用ssl(只是一个通用网站),但是cloudflare灵活的ssl正在处理ssl方面.

语言:PHP(codeignighter,但这并不重要)

目标:浏览域"exmple.com/ "或"http:// exmple.com/ "时,生成变量"http:// example.com",并在浏览"https:// example.com"时/*"生成变量"https:// example.com".

什么应该工作(但不是):

$root = '';
if( isset($_SERVER['HTTPS'] )  && $_SERVER['HTTPS'] != 'off' )
{
    //it doesnt reach here...
    $root .= 'https://';
}
else
{
    $root .= 'http://';
}
$root  .= "".$_SERVER['HTTP_HOST'];
$root .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
Run Code Online (Sandbox Code Playgroud)

我总是可以做到:"// example.com",但这对我来说并没有真正解决问题.思考?我应该做一些字符串比较来确定https-ness吗?

我确定原因是当请求到达服务器(https或http)时,它来自端口80并且它不会被识别为ssl,因此未定义$ _SERVER ['HTTPS'].我可以在服务器和cloudflare之间设置一个自定义的ssl,但如果我可以使用一些正则表达式并以某种方式比较网址,那么会更好(更省力).

我还想知道可能存在的问题和漏洞.

谢谢 :)

dec*_*cay 28

好的,我将回答有关同样问题的未来人的问题:

if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])){
    $root .= $_SERVER['HTTP_X_FORWARDED_PROTO'].'://';
}
else{
    $root .= !empty($_SERVER['HTTPS']) ? "https://" : "http://";
}
Run Code Online (Sandbox Code Playgroud)

当我仔细观察$_SERVER,并在谷歌上搜索HTTP_X_FORWARDED_PROTO并得到我的几页确认这一点时,它就碰到了它.


Myg*_*god 8

$_SERVER['HTTP_X_FORWARDED_PROTO']不适合我.我不知道为什么.无论如何,这是我的解决方案:

function is_https_buttflare() {
    return isset($_SERVER['HTTPS']) ||
        ($visitor = json_decode($_SERVER['HTTP_CF_VISITOR'])) &&
            $visitor->scheme == 'https';
}
Run Code Online (Sandbox Code Playgroud)


iam*_*ual 6

它对我来说没有问题。您可以在任何地方使用:

function is_ssl_active() {
  if (isset($_SERVER['HTTP_CF_VISITOR'])) {
    $cf_visitor = json_decode($_SERVER['HTTP_CF_VISITOR']);
    if (isset($cf_visitor->scheme) && $cf_visitor->scheme == 'https') {
      return true;
    }
  } else if (isset($_SERVER['HTTPS'])) {
    return true;
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

Cloudflare 放置了一些 HTTP 标头,例如“CF-Visitor”。单击此处了解更多信息。