Aktualizacja : CloudFlare wydał moduł mod_cloudflare
dla Apache, moduł będzie logował i wyświetlał rzeczywiste adresy IP odwiedzających, a nie te, do których uzyskuje dostęp cloudflare! https://www.cloudflare.com/resources-downloads#mod_cloudflare (odpowiedź od: olimortimer )
Jeśli nie masz dostępu do środowiska uruchomieniowego Apache, możesz użyć poniższego skryptu, który pozwoli ci sprawdzić, czy połączenie było przez Cloudflare i uzyskać IP użytkowników.
Przepisuję odpowiedź, której użyłem do innego pytania „ CloudFlare DNS / direct IP identifier ”
Adresy IP Cloudflare są przechowywane publicznie, więc możesz je wyświetlić tutaj, a następnie sprawdzić, czy adres IP pochodzi z Cloudflare (pozwoli nam to uzyskać prawdziwy adres IP z nagłówka http HTTP_CF_CONNECTING_IP
).
Jeśli używasz tego do wyłączania wszystkich połączeń innych niż cf lub odwrotnie, polecam mieć jeden plik skryptu php, który jest wywoływany przed każdym innym skryptem, takim jak common.php lub pagestart.php itp.
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'];
}
}
Korzystanie ze skryptu jest dość proste:
$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'];
Ten skrypt pokaże ci prawdziwy adres IP i czy żądanie jest CF, czy nie!