【PHP】判断当前访问域名是否是https

/**
 * @name is_https 判断是否是https
 * @author bo1839 <Email:937560433@qq.com>
 * @return bool
 * Description 判断是否是https
 * Date: 2021/2/24 17:32:13
 */
public static function is_https() {
    if ( !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
        return true;
    } elseif ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_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;   
}

注解:

  • $_SERVER['HTTPS']

http头部

  • $_SERVER['HTTP_X_FORWARDED_PROTO']

X-Forwarded-Proto(XFP)报头是用于识别协议(HTTP 或 HTTPS),其中使用的客户端连接到代理或负载平衡器一个事实上的标准报头。您的服务器访问日志包含在服务器和负载平衡器之间使用的协议,但不包括客户端和负载平衡器之间使用的协议。要确定客户端和负载平衡器之间使用的协议,X-Forwarded-Proto可以使用请求标头。 此标头的标准化版本是 HTTP Forwarded标头。

  • $_SERVER['HTTP_FRONT_END_HTTPS']

X-Forwarded-Proto 的非标准形式

 

延伸

Nginx+php 架构下解决不输出 $_SERVER['HTTPS'] 问题

使用$_SERVER['HTTPS']来判断是http还是https,但在Nginx+PHP-FPM架构下,

nginx使用fastcgi_pass指令将请求传递给PHP-FPM,但是在使用fastcgi_pass时,Nginx默认不会将HTTPS传递给PHP-FPM。

如果你使用的是Apache,它就会自动设置HTTPS服务器变量,PHP代码可以通过$ _SERVER ['HTTPS']检查以确定请求是HTTPS还是HTTP。

那现在就需要需改nginx配置或者PHP程序来解决问 题。

基于服务器的兼容性考虑,还是修改nginx配置。

因为很多CMS程序(WordPress,Drupal,...)都是使用$ _SERVER ['HTTPS']来确定请求是HTTPS还是HTTP。

修改方法如下:

  • 方法1:增加 一个fastcgi_param 环境变量即可。
fastcgi_param  HTTPS 'on';

将上述代码添加至网站对应的Nginx配置文件中。

但要注意,按我理解,这样也会导致一个问题。因为这种方式属于写死环境变量,在此环境变量生效的区域,

服务器无法判断是http请求还是https请求。如果你的站点两种请求都支持,

建议把两种请求的配置分开写,

类似与人工预设请求的类型。我的网站决定已经只支持https,

所以这种方式问题不大,http的请求也设置了跳转至https。所以我只需要是写在虚拟机配置文件中即可。

  • 方法2:修改web程序的判断方式

不要只根据环境变量来判断,增加一个请求的端口的判断条件。

我们一般HTTP请求都使用80端口,而HTTPS则使用443端口。按照这个思路,可以将上诉文件中的代码改为如下所示。

 


文献参考

第一部分代码来源于网络,具体来源记不清了

第二部分注解来源:https://www.wenjiangs.com/doc/8tbqaryr

第三部分延伸转载自 

屌丝的IT

https://www.cnblogs.com/centos-python/articles/11068301.html 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值