我们开始在我的工作中使用CloudFlare的,我想了解的CloudFlare如何知道我把DNS名称在我的浏览器,而不是直接的IP。
我的意思是 - 他们是如何知道如果我把www.mysite.com和NOT 123.34.45.45的URL我的浏览器。
有没有在HTTP GET头或任何其他标识符的任何标志?
非常感谢。
我们开始在我的工作中使用CloudFlare的,我想了解的CloudFlare如何知道我把DNS名称在我的浏览器,而不是直接的IP。
我的意思是 - 他们是如何知道如果我把www.mysite.com和NOT 123.34.45.45的URL我的浏览器。
有没有在HTTP GET头或任何其他标识符的任何标志?
非常感谢。
这是DNS是如何工作的 。
“域名系统分配通过指定权威名称服务器为每个域分配域名和映射这些名称为IP地址的责任”
有这样做的一种方式。
在Apache,而不是做一个公共的根目录中,使用虚拟主机,而不是他们只会给请求的虚拟主机响应。 虽然它比没有它仍然可以通过途径的众多量显示更好。 CloudFlare的发布模块mod_cloudflare
为Apache,该模块将记录并显示实际访问者的IP地址,而不是那些由CloudFlare的访问! https://www.cloudflare.com/resources-downloads#mod_cloudflare (回答: olimortimer )
我建议你在PHP中做到这一点:CloudFlare的IPS存储在公共所以你可以去查看他们在这里然后检查IP是从CloudFlare的(这将使我们能够获得来自HTTP标头的真实IP HTTP_CF_CONNECTING_IP
)。
如果你正使用该禁用所有非CF连接或反之亦然,我建议你有一个被所有其他脚本之前称为单一的PHP脚本文件如的common.php或pagestart.php等。
function ip_in_range($ip, $range) {
if (strpos($range, '/') == false)
$range .= '/32';
// $range is in IP/CIDR format eg 127.0.0.1/24
list($range, $netmask) = explode('/', $range, 2);
$range_decimal = ip2long($range);
$ip_decimal = ip2long($ip);
$wildcard_decimal = pow(2, (32 - $netmask)) - 1;
$netmask_decimal = ~ $wildcard_decimal;
return (($ip_decimal & $netmask_decimal) == ($range_decimal & $netmask_decimal));
}
function _cloudflare_CheckIP($ip) {
$cf_ips = array(
'199.27.128.0/21',
'173.245.48.0/20',
'103.21.244.0/22',
'103.22.200.0/22',
'103.31.4.0/22',
'141.101.64.0/18',
'108.162.192.0/18',
'190.93.240.0/20',
'188.114.96.0/20',
'197.234.240.0/22',
'198.41.128.0/17',
'162.158.0.0/15',
'104.16.0.0/12',
);
$is_cf_ip = false;
foreach ($cf_ips as $cf_ip) {
if (ip_in_range($ip, $cf_ip)) {
$is_cf_ip = true;
break;
}
} return $is_cf_ip;
}
function _cloudflare_Requests_Check() {
$flag = true;
if(!isset($_SERVER['HTTP_CF_CONNECTING_IP'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_IPCOUNTRY'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_RAY'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_VISITOR'])) $flag = false;
return $flag;
}
function isCloudflare() {
$ipCheck = _cloudflare_CheckIP($_SERVER['REMOTE_ADDR']);
$requestCheck = _cloudflare_Requests_Check();
return ($ipCheck && $requestCheck);
}
// Use when handling ip's
function getRequestIP() {
$check = isCloudflare();
if($check) {
return $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
要使用它很简单的脚本:
$ip = getRequestIP();
$cf = isCloudflare();
if($cf) echo "Cloudflare :D<br>";
else echo "Not cloudflare o_0";
echo "Your actual ip address is: ". $ip;
该脚本应该帮助你检查,如果该请求是从CF而不是直接虽然IP地址。