Güncelleme : CloudFlare, mod_cloudflare
apache için bir modül yayınladı , modül, cloudflare tarafından erişilenler yerine gerçek ziyaretçi IP Adreslerini kaydedecek ve görüntüleyecektir! https://www.cloudflare.com/resources-downloads#mod_cloudflare (Cevap: olimortimer )
Apache çalışma zamanına erişiminiz yoksa, aşağıdaki betiği kullanabilirsiniz, bu, bağlantının cloudflare üzerinden olup olmadığını kontrol etmenize ve kullanıcıların ipini almanıza olanak tanır.
Başka bir soru " CloudFlare DNS / doğrudan IP tanımlayıcısı " için kullandığım cevabımı yeniden yazıyorum
Cloudflare'nın ips'leri halka açık olarak saklanır, böylece buradan onları görüntüleyebilir ve ipin cloudflare'den gelip gelmediğini kontrol edebilirsiniz (bu, gerçek ip'i http başlığından almamızı sağlar HTTP_CF_CONNECTING_IP
).
Bunu cf olmayan tüm bağlantıları devre dışı bırakmak için kullanıyorsanız veya tam tersi, bir common.php veya pagestart.php gibi diğer her komut dosyasından önce çağrılan tek bir php komut dosyasına sahip olmanızı öneririm.
function ip_in_range($ip, $range) {
if (strpos($range, '/') == false)
$range .= '/32';
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);
}
function getRequestIP() {
$check = isCloudflare();
if($check) {
return $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
Komut dosyasını kullanmak oldukça basit:
$ip = getRequestIP();
$cf = isCloudflare();
if($cf) echo "Connection is through cloudflare: <br>";
else echo "Connection is not through cloudflare: <br>";
echo "Your actual ip address is: ". $ip;
echo "The server remote address header is: ". $_SERVER['REMOTE_ADDR'];
Bu komut dosyası size gerçek ip adresini ve isteğin CF olup olmadığını gösterecektir!