使用 PHP 检测 SSL [重复]
Posted
技术标签:
【中文标题】使用 PHP 检测 SSL [重复]【英文标题】:Detecting SSL With PHP [duplicate] 【发布时间】:2011-11-10 09:02:16 【问题描述】:可能重复:How To Find Out If You are Using HTTPS Without $_SERVER['HTTPS']
我在网上四处寻找检测服务器是否使用 HTTPS 连接的方法,但似乎没有一个网站能提供所有答案(以及一些不同的答案)。检测服务器是否使用 HTTPS 与 php 连接的所有方法到底是什么?我需要知道几种检测 SSL 的方法,因为我的一些脚本被重新分发并且不同的服务器处理事情的方式不同。
【问题讨论】:
“我需要知道几种检测 SSL 的方法,因为我的一些脚本被重新分发并且不同的服务器处理事情的方式不同。” 并非所有服务器都一定允许您检测到什么使用了传输机制。相反,您应该支持几种不同的方法来确定是否使用了 HTTPS,特别是仅列出支持这些方法的服务器。支持所有 PHP 环境是不合理的。 我知道这一点,但我需要能够尽可能地覆盖。我的职责是让我的客户尽可能轻松,而不是限制他们。 变量$_SERVER['REQUEST_SCHEME']
返回http
或https
【参考方案1】:
WordPress 的核心is_ssl() 函数还添加了对服务器端口的检查:
function is_ssl()
if ( isset($_SERVER['HTTPS']) )
if ( 'on' == strtolower($_SERVER['HTTPS']) )
return true;
if ( '1' == $_SERVER['HTTPS'] )
return true;
elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) )
return true;
return false;
【讨论】:
并不是说端口 443 一定意味着连接是 SSL 加密的...... :) 没错,我只是指出另一种方法来尝试检测它。这不是为了确保连接是加密的,更多的是关于尝试检测您的服务器模式,以便您可以确保从同一服务器加载所有资产(即 http s://yoursite.com 与 http://yoursite. com) 对于最简单的用例,只要你知道自己的服务器,只检查端口就足够好了。 我使用提供 SSL 的第三方 CDN 服务 CloudFlare。但只有与 CloudFlare 的连接是安全的,当 CloudFlare 联系我们的服务器时,它是不安全的。所以在测试这段代码时要注意那个...哈哈 @rorypicko 对于像 Cloudflare 这样的反向代理,如果浏览器使用 HTTPS 连接到 CF,则应检查标头X-Forwarded-Proto
,该标头应设置为 https
。有时使用的另一个标题,特别是对于 MS 软件,是 Front-End-Https: on
【参考方案2】:
$_SERVER['HTTPS']
如果脚本是通过 HTTPS 协议查询的,则设置为非空值。 注意:请注意,在 IIS 中使用 ISAPI 时,如果请求不是通过 HTTPS 协议发出的,则该值将为 off。
http://www.php.net/manual/en/reserved.variables.server.php
所以,这就行了:
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
// SSL connection
【讨论】:
在行为正确的服务器上“会做” ;-) 当然,如果服务器配置错误,那么所有的赌注都已经关闭。 +1。 没错,我必须确保我抓住了一切。大部分时间获得我的脚本的人都有免费托管,但并非所有人都很好。我只需要抓住尽可能多的可能性。 @Phillip 如果 Web 服务器没有将连接方法传达给 PHP,那么您无能为力。 HTTPS 环境变量旨在传达 SSL 状态,如果服务器不使用它或使用其他东西,它可能是 anything。如果需要对其进行自定义以适应特定的不兼容主机,您可以定义客户端可以自定义的可覆盖方法或函数。 是的,但我一定要试试。更多满意的客户等于更多的回头客。不过感谢您的帮助。以上是关于使用 PHP 检测 SSL [重复]的主要内容,如果未能解决你的问题,请参考以下文章