Php 如何确定您是否';在没有$#u服务器的情况下重新使用HTTPS[';HTTPS';]
我在网上看过很多教程,上面说如果服务器连接使用HTTPS进行保护,则需要检查Php 如何确定您是否';在没有$#u服务器的情况下重新使用HTTPS[';HTTPS';],php,https,Php,Https,我在网上看过很多教程,上面说如果服务器连接使用HTTPS进行保护,则需要检查$\u SERVER['HTTPS']。我的问题是,在我使用的一些服务器上,$\u SERVER['HTTPS']是一个未定义的变量,会导致错误。是否有另一个变量我可以检查,应该始终定义 为了清楚起见,我目前正在使用此代码来解析它是否为HTTPS连接: if(isset($_SERVER['HTTPS'])) { if ($_SERVER['HTTPS'] == "on") { $secure_c
$\u SERVER['HTTPS']
。我的问题是,在我使用的一些服务器上,$\u SERVER['HTTPS']
是一个未定义的变量,会导致错误。是否有另一个变量我可以检查,应该始终定义
为了清楚起见,我目前正在使用此代码来解析它是否为HTTPS连接:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$secure_connection = true;
}
}
您可以检查
$\u SERVER['SERVER\u PORT']
,因为SSL通常在端口443上运行,但这不是万无一失的。Chacha,根据PHP文档:“如果通过HTTPS协议查询脚本,则将其设置为非空值。”因此,在许多情况下,如果HTTPS确实打开,则if语句将返回false。您需要验证$\u服务器['HTTPS']
是否存在并且是否为非空。如果给定服务器的HTTPS设置不正确,您可以尝试检查$\u server['server\u PORT']==443
但请注意,一些服务器也会将$\u SERVER['HTTPS']
设置为非空值,因此一定要检查此变量
参考:根据hobodave的帖子:“如果通过HTTPS协议查询脚本,则设置为非空值。”
即使未定义
$\u服务器['HTTPS']
时,此选项也应始终有效:
function isSecure() {
return
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| $_SERVER['SERVER_PORT'] == 443;
}
该代码与IIS兼容
从:
1) 如果通过HTTPS协议查询脚本,则设置为非空值
if (!empty($_SERVER['HTTPS']))
{
$secure_connection = true;
}
2) 请注意,在IIS中使用ISAPI时,如果请求不是通过HTTPS协议发出的,则该值将为“off”。(IIS7运行PHP作为快速CGI应用程序的情况也有报道)
此外,Apache1.x服务器(以及损坏的安装)可能没有定义$\u SERVER['HTTPS']
,即使连接安全。虽然不能保证,但端口443上的连接可能使用额外的端口检查
附加说明:如果客户端和服务器之间存在负载平衡器,则此代码不会测试客户端和负载平衡器之间的连接,而是测试负载平衡器和服务器之间的连接。要测试前一个连接,您必须使用HTTP_X_FORWARDED_PROTO头进行测试,但这要复杂得多;请参见下面的答案。真正的答案:准备好复制粘贴到[config]脚本中了
/*配置设置;X=2011年5月10日编辑*/
$pv_sslport=443;/*因为这可能是不同的,加布里埃尔·索萨也说过*/
$pv_服务器端口=80;/*X*/
$pv_servername=“mysite.com”;/*X*/
/*迈克尔·科平斯基更正后追加的X*/
如果(!isset($_服务器[“服务器名称”])| |!$_服务器[“服务器名称”]){
如果(!isset($\u ENV[“服务器名称”])){
getenv(“服务器名称”);
//设置为环境服务器名称
$\u服务器[“服务器名称”]=$\u环境[“服务器名称”];
}
}
如果(!$\u服务器[“服务器名称”])(
/*X服务器名称仍然为空?…您可以设置$\u服务器[“服务器名称”]=$pv\u服务器名称*/
}
如果(!isset($_服务器[“服务器\端口])| |!$_服务器[“服务器\端口”])){
如果(!isset($\u ENV[“服务器\u端口”])){
getenv(“服务器_端口”);
$\服务器[“服务器\端口”]=$\环境[“服务器\端口”];
}
}
如果(!$\服务器[“服务器\端口”])(
/*X服务器端口仍然为空?…您可以设置$\u服务器[“服务器端口”]=$pv\u服务器端口*/
}
$pv|u URIprotocol=isset($|u SERVER[“HTTPS”])?($|u SERVER[“HTTPS”]====”on“|$$| u SERVER[“SERVER|u PORT”]====”pv|u sslport)?“HTTPS://“:”http:/”($| u SERVER[“SERVER|u PORT”=====”pv u sslport)?“HTTPS:/”:“http:/”;
$pv\u URIprotocol
现在是正确的,可以使用;示例$site=$pv\u URIprotocol.$\u SERVER[“SERVER\u NAME”]
。当然,字符串也可以替换为TRUE和FALSE。PV代表PortalPress变量,因为它是一种直接复制粘贴,可以一直工作。这一部分可以在生产脚本中使用。我刚刚遇到一个问题,我使用Apache mod\u ssl运行服务器,但使用了phpinfo()和var\u dump($\u服务器)显示PHP仍然认为我在端口80上
这是我为有相同问题的人提供的解决方法
<VirtualHost *:443>
SetEnv HTTPS on
DocumentRoot /var/www/vhost/scratch/content
ServerName scratch.example.com
</VirtualHost>
SetEnv HTTPS on
DocumentRoot/var/www/vhost/scratch/content
ServerName scratch.example.com
值得注意的一行是SetEnv行。有了SetEnv行,在重新启动后,您应该拥有您一直梦想的HTTPS环境变量。我认为添加端口不是一个好主意,特别是当您有许多具有不同版本的服务器时。这只是增加了另一件需要记住更改的事情。查看doc的我认为Kaiser的最后一行非常好,因此:
if(!empty($_SERVER["HTTPS"]))
if($_SERVER["HTTPS"]!=="off")
return 1; //https
else
return 0; //http
else
return 0; //http
似乎已经足够完美了。唯一可靠的方法是Igor M描述的方法
$pv_URIprotocol = isset($_SERVER["HTTPS"]) ? (($_SERVER["HTTPS"]==="on" || $_SERVER["HTTPS"]===1 || $_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://") : (($_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://");
考虑以下几点:
您将nginx与fastcgi一起使用,默认情况下(debian、ubuntu)fastgi_params contain指令:
fastcgi_参数HTTPS$HTTPS
如果您不使用SSL,它将被转换为空值,而不是“off”,而不是0
你注定要失败
我的解决方案(因为标准条件[$\u SERVER['HTTPS']=='on']在负载平衡器后面的服务器上不起作用)是:
HTTP_X_FORWARDED_PROTO:用于识别HTTP请求的原始协议的事实标准,因为反向代理(负载平衡器)可以使用HTTP与web服务器通信,即使对反向代理的请求是HTTPS
我发现这些参数也可以接受,而且在切换web服务器时很可能没有误报
if($_SERVER['HTTPS_KEYSIZE'] != NULL){/*do foobar*/}
我使用的最短路径:
$secure_connection = !empty($_SERVER['HTTPS']);
如果使用https,则$secure\u connection为true。这是一个我已经使用了一段时间的可重用函数。HTH 注
$secure_connection = !empty($_SERVER['HTTPS']);
/**
* Determine if this is a secure HTTPS connection
*
* @return bool True if it is a secure HTTPS connection, otherwise false.
*/
function isSSL()
{
if (isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == 1) {
return true;
} elseif ($_SERVER['HTTPS'] == 'on') {
return true;
}
} elseif ($_SERVER['SERVER_PORT'] == HTTPS_PORT) {
return true;
}
return false;
}
if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
$scheme = 'https';
else
$scheme = 'http';
RewriteEngine on
RewriteCond %{HTTPS} =on [NC]
RewriteRule .* - [E=HTTPS:on,NE]
HTTPS : 1
HTTPS : 1, on
if( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 ){
//enable secure connection
}
$_SERVER["REQUEST_SCHEME"]
$secure_connection = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || (!empty($_SERVER['HTTP_HTTPS']) && $_SERVER['HTTP_HTTPS'] != 'off') || $_SERVER['REQUEST_SCHEME'] == 'https' || $_SERVER['SERVER_PORT'] == 443) ? true : false;
proxy_set_header X-HTTPS 1;
function isSSL() {
$https = filter_input(INPUT_SERVER, 'HTTPS');
$port = filter_input(INPUT_SERVER, 'SERVER_PORT');
if ($https) {
if ($https == 1) {
return true;
} elseif ($https == 'on') {
return true;
}
} elseif ($port == '443') {
return true;
}
return false;
}
public static function isHttps()
{
if (array_key_exists("HTTPS", $_SERVER) && 'on' === $_SERVER["HTTPS"]) {
return true;
}
if (array_key_exists("SERVER_PORT", $_SERVER) && 443 === (int)$_SERVER["SERVER_PORT"]) {
return true;
}
if (array_key_exists("HTTP_X_FORWARDED_SSL", $_SERVER) && 'on' === $_SERVER["HTTP_X_FORWARDED_SSL"]) {
return true;
}
if (array_key_exists("HTTP_X_FORWARDED_PROTO", $_SERVER) && 'https' === $_SERVER["HTTP_X_FORWARDED_PROTO"]) {
return true;
}
return false;
}
function hasSSL($url)
{
// take the URL down to the domain name
$domain = parse_url($url, PHP_URL_HOST);
$ch = curl_init('https://' . $domain);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); //its a HEAD
curl_setopt($ch, CURLOPT_NOBODY, true); // no body
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // in case of redirects
curl_setopt($ch, CURLOPT_VERBOSE, 0); //turn on if debugging
curl_setopt($ch, CURLOPT_HEADER, 1); //head only wanted
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // we dont want to wait forever
curl_exec($ch);
$header = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($header === 200) {
return true;
}
return false;
}
$https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0 ||
!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0;
return ($https) ? 'https://' : 'http://';
if( ($_SERVER['HTTPS'] ?? 'off') == 'off' ) {
// redirect
}
<?php
echo "<br>1 ".$_SERVER["HTTPS"];
echo "<br>2 ".$_SERVER["SERVER_PORT"];
echo "<br>3 ".$_SERVER["HTTP_X_FORWARDED_PROTO"];
echo "<br>4 ".$_SERVER["HTTP_X_FORWARDED_SSL"];
echo "<br>5 ".$_SERVER["HTTP_HTTPS"];
echo "<br>6 ".$_SERVER["REQUEST_SCHEME"];
?>
<html>
<body>
<br>
Just cruising
</body>
</html>
function is_ssl(){
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO']=="https"){ return true; }
elseif(isset($_SERVER['HTTPS'])){ return true; }
elseif($_SERVER['SERVER_PORT'] == 443){ return true; }
else{ return false; }
}
if(is_ssl()){
// WHAT TO DO IF IT IS SSL / HTTPS
}else{
// WHAT TO DO IF IT IS NOT SSL / HTTPS
}
$isSsl = false;
if (isset($_SERVER['HTTP_CF_VISITOR'])) {
$cfDecode = json_decode($_SERVER['HTTP_CF_VISITOR']);
if (!empty($cfDecode) && !empty($cfDecode->scheme) && $cfDecode->scheme == 'https') {
$isSsl = true;
}
}
var_dump($isSsl);