由于此变量并非在所有 Web 服务器版本中都可用,因此仅对它进行测试是不可靠的。相反,您可以更改您的 PHP 代码以测试另外两个服务器环境变量,这也可以表明正在使用 https,如下所示:
if ( (! empty($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') ||
(! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ||
(! empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443') ) {
$server_request_scheme = 'https';
} else {
$server_request_scheme = 'http';
}
正如 toxalot 所说,REQUEST_SCHEME 自 2.4 版以来就是 Apache Web 服务器的本机变量。Apache 2.2 没有它(参见Apache 2.2 服务器变量),Microsoft IIs 8.5 也没有它(参见IIS 8.5 服务器变量)。自然,如果服务器没有设置变量,PHP 不会将它包含在其全局数组 $_SERVER 中。
幸运的是,为了与仅基于 REQUEST_SCHEME 检查的代码兼容,您可以在 Apache 2.2 中创建此变量,编辑所有主机配置文件(httpd.conf、ssl.conf、000-default.conf、vhosts.conf),添加以下行:
# FOR HOSTS LISTENING AT PORT 80
SetEnvIf Request_Protocol ^HTTP/ REQUEST_SCHEME=http
# FOR HOSTS LISTENING AT PORT 443
SetEnvIf Request_Protocol ^HTTP/ REQUEST_SCHEME=https
上面的代码假定每个协议都使用一个虚拟主机(Apache 中的最佳实践 - 请参阅this和that)。