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

189 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() );
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

Ivo*_*Ivo 87

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

$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === 0 ? 'https://' : 'http://';
Run Code Online (Sandbox Code Playgroud)

如果你不喜欢,甚至没有条件

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

看一下 $_SERVER["SERVER_PROTOCOL"]

  • 这不适用于"https"http://stackoverflow.com/questions/16825243/why-is-phps-server-protocol-showing-http-1-1-even-when-using-https (19认同)
  • `$ _SERVER ['SERVER_PROTOCOL']`用来存储`HTTP/1.0`或`HTTP/1.1`,具体取决于协议版本,你谈到什么样的HTTP服务器配置,在这个字符串上存储`https`信息来自http查询? (12认同)
  • `stripos`永远不会返回`true`.http://php.net/manual/en/function.stripos.php (12认同)
  • 你必须使用isset($ _ SERVER ['HTTPS'])?'https://':'http://'; 代替 (5认同)
  • 在我的情况下不起作用!$_SERVER['SERVER_PROTOCOL'] 包含“HTTP”(没有任何“S”),而协议是 https。检查 $_SERVER['HTTPS'] 更合适。 (4认同)

pro*_*php 68

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

  • 值得注意的是,如果你只是放弃协议,它是自动的..即`// mysqite.com`而不是`https:// mysitecom` (18认同)
  • @Pamblam,//除非您的链接在电子邮件中,否则效果很好:) (3认同)

Rid*_*ous 64

这适合我

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://';
}
Run Code Online (Sandbox Code Playgroud)

  • 这是使用代理时有效的解决方案(就像在我的案例中CloudFlare一样) (3认同)
  • 这是正确的 - 您不应该仅仅因为使用端口 443 就假设使用 https。 (3认同)

小智 25

一些变化:

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


小智 16

简短的方法

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
Run Code Online (Sandbox Code Playgroud)

  • 在Apache 2.4之前,REQUEST_SCHEME不可用. (5认同)
  • `REQUEST_SCHEME`不可靠 (3认同)

ale*_*lex 7

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

define('HTTPS', isset($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));
Run Code Online (Sandbox Code Playgroud)

HTTPS报酬不变TRUE,如果$_SERVER['HTTPS']是"上"或"是"设置和等于"1","真实的".否则返回FALSE.


Eug*_*nko 6

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

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].'/';
Run Code Online (Sandbox Code Playgroud)

要么

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].'/';
Run Code Online (Sandbox Code Playgroud)

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


Gui*_*ume 6

从 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


sha*_*493 5

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

 $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
 echo $scheme; //it gives http:// or https://
Run Code Online (Sandbox Code Playgroud)

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


Har*_*hit 5

如果使用代理,则SERVER_PORT可能无法提供正确的值,因此这对我有用-

$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"
Run Code Online (Sandbox Code Playgroud)