Cập nhật : CloudFlare đã phát hành một mô-đun mod_cloudflare
cho apache, mô-đun này sẽ ghi nhật ký và hiển thị Địa chỉ IP của khách truy cập thực tế chứ không phải là những địa chỉ được cloudflare truy cập! https://www.cloudflare.com/resources-downloads#mod_cloudflare (Trả lời bởi: olimortimer )
Nếu bạn không có quyền truy cập vào thời gian chạy apache, bạn có thể sử dụng tập lệnh bên dưới, điều này sẽ cho phép bạn kiểm tra xem kết nối có thông qua cloudflare hay không và lấy ip của người dùng.
Tôi đang viết lại câu trả lời của mình mà tôi đã sử dụng cho một câu hỏi khác " CloudFlare DNS / định danh IP trực tiếp "
Các ips của Cloudflare được lưu trữ công khai nên bạn có thể xem chúng tại đây sau đó kiểm tra xem ip có phải từ cloudflare hay không (điều này sẽ cho phép chúng tôi lấy ip thực từ tiêu đề http HTTP_CF_CONNECTING_IP
).
Nếu bạn đang sử dụng điều này để tắt tất cả các kết nối không phải cf hoặc ngược lại, tôi khuyên bạn nên có một tệp tập lệnh php duy nhất được gọi trước mọi tập lệnh khác chẳng hạn như common.php hoặc pagestart.php, v.v.
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'];
}
}
Để sử dụng script, nó khá đơn giản:
$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'];
Tập lệnh này sẽ hiển thị cho bạn địa chỉ ip thực và yêu cầu có phải là CF hay không!