업데이트 : CloudFlare는 mod_cloudflare
아파치 용 모듈 을 출시했습니다. 모듈 은 cloudflare가 액세스하는 것이 아닌 실제 방문자 IP 주소를 기록하고 표시합니다! https://www.cloudflare.com/resources-downloads#mod_cloudflare (답변 : olimortimer )
아파치 런타임에 액세스 할 수없는 경우 아래 스크립트를 사용할 수 있습니다. 이렇게하면 연결이 cloudflare를 통해 이루어 졌는지 확인하고 사용자 IP를 얻을 수 있습니다.
다른 질문 " CloudFlare DNS / 직접 IP 식별자 "에 사용한 내 답변을 다시 작성하고 있습니다.
Cloudflare의 ip는 공개되어 있으므로 여기에서 확인한 다음 ip가 cloudflare에서 온 것인지 확인할 수 있습니다 (이를 통해 http 헤더에서 실제 IP를 가져올 수 있습니다 HTTP_CF_CONNECTING_IP
).
이것을 사용하여 모든 비 cf 연결을 비활성화하거나 그 반대의 경우 common.php 또는 pagestart.php 등과 같은 다른 모든 스크립트보다 먼저 호출되는 단일 PHP 스크립트 파일을 갖는 것이 좋습니다.
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'];
}
}
스크립트를 사용하려면 매우 간단합니다.
$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'];
이 스크립트는 실제 IP 주소와 요청이 CF인지 여부를 보여줍니다!