我在网上看过很多教程,上面说你需要判断$_SERVER['HTTPS']个服务器连接是否使用HTTPS保护.我的问题是,在我使用的一些服务器上,$_SERVER['HTTPS']是一个未定义的变量,会导致错误.是否有其他我可以判断的变量应该始终定义?

我想明确一点,我目前正在使用此代码来解析它是否是HTTPS连接:

if(isset($_SERVER['HTTPS'])) {
    if ($_SERVER['HTTPS'] == "on") {
        $secure_connection = true;
    }
}

推荐答案

即使$_SERVER['HTTPS']未定义,也应始终有效:

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

该代码与IIS兼容.

PHP.net documentation and user comments人中:

  1. 如果通过HTTPS协议查询脚本,则设置为非空值.

  2. 请注意,在IIS中使用ISAPI时,如果请求不是通过HTTPS协议发出的,则该值将为"off".(IIS7运行PHP作为快速CGI应用程序的情况也有报道).

还有Apache1.即使安全连接,x服务器(以及损坏的安装)也可能没有定义.虽然不能保证,但端口443上的连接可能使用secure sockets,因此需要额外的端口判断.

附加说明:如果客户机和服务器之间存在负载平衡器,则此代码不会测试客户机和负载平衡器之间的连接,而是测试负载平衡器和服务器之间的连接.要测试前一个连接,必须使用HTTP_X_FORWARDED_PROTO报头进行测试,但这要复杂得多;见下面latest comments条答案.

Php相关问答推荐

将WooCommerce订购项目管理产品链接更改为产品永久链接(前端)

产品ACF值在WooCommerce我的账户订单的附加列中为空

在Laravel中,如果我用session—put()存储一些信息,客户端浏览器是否可以使用这些信息?>

WooCommerce在store 页面上显示兼容多语言的产品属性

如何将对我的域的请求重定向到子文件夹中的索引,同时保留域URL并使用.htaccess?

致命错误:未捕获错误:Google\Auth\HttpHandler\HttpHandlerFactory::build()

PHP:PHP手册-Manual

将文件添加到存档,而不重建存档

Laravel处理belongToMany和额外字段

如何批量处理消息总线中的消息

Shopware 6 插件:如何删除布尔配置并将其迁移到多选配置

Laravel 在数据库上显示加密列

根据小计向 WooCommerce Checkout 添加佣金

如何在 Phpunit 的静态提供程序中创建测试双打?

PHP 在数组中搜索值

无法使用 slim 的父级容器

当所有对象都属于同一类型时,我可以省略 PHP in_array() 中的 strict 参数吗?

来自 GoDaddy 的邮箱在 Gmail 中显示为via

如何获取用户之间的最新消息列表

即使密码匹配,密码处理程序也会返回错误