首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CloudFlare和日志访问者的IP地址

CloudFlare和日志访问者的IP地址
EN

Stack Overflow用户
提问于 2013-02-21 00:56:53
回答 11查看 108.5K关注 0票数 96

我正在尝试使用PHP的$_SERVER['REMOTE_ADDR']来跟踪和记录访问我网站的用户/访问者。PHP中IP地址跟踪的典型方法。

但是,我使用CloudFlare进行缓存,并接收它们的IP地址,如CloudFlare的:

108.162.212.* -108.162.239。*

在仍然使用CloudFlare的情况下检索实际用户/访问者IP地址的正确方法是什么?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-02-21 01:03:08

云flare可用的额外服务器变量包括:

$_SERVER["HTTP_CF_CONNECTING_IP"]真实访客ip地址,这就是你想要的

$_SERVER["HTTP_CF_IPCOUNTRY"]访问者的国家/地区

$_SERVER["HTTP_CF_RAY"]

这可以帮助你知道是$_SERVER["HTTP_CF_VISITOR"]还是https

你可以这样使用它:

代码语言:javascript
复制
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
  $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}

如果执行此操作,并且访问IP地址的有效性很重要,则可能需要验证$_SERVER["REMOTE_ADDR"]是否包含实际有效的cloudflare IP地址,因为如果任何人能够直接连接到服务器IP,则任何人都可以伪造报头。

票数 281
EN

Stack Overflow用户

发布于 2016-07-11 09:37:54

更新:CloudFlare已经为apache发布了一个模块mod_cloudflare,该模块将记录并显示实际的访客IP地址,而不是cloudflare!https://www.cloudflare.com/resources-downloads#mod_cloudflare访问的IP地址(回答者:olimortimer)

如果您没有访问apache运行时的权限,可以使用下面的脚本,这将允许您检查连接是否通过cloudflare并获取用户的ip。

我正在重写我用于另一个问题"CloudFlare DNS / direct IP identifier“的答案。

cloudflare的ip是公共存储的,所以你可以去查看它们,然后检查ip是否来自cloudflare(这将允许我们从http头HTTP_CF_CONNECTING_IP获取真实的ip)。

如果你使用它来禁用所有非cf连接,或者反之亦然,我建议你有一个单独的php脚本文件,它在common.php或pagestart.php等其他脚本之前被调用。

代码语言:javascript
复制
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'];
    }
}

要使用该脚本,非常简单:

代码语言:javascript
复制
$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!

票数 18
EN

Stack Overflow用户

发布于 2015-05-06 21:49:07

自从这个问题被问到并回答后,CloudFlare已经发布了用于Apache的mod_cloudflare,它记录和显示实际的访问者IP地址,而不是CloudFlare地址:

https://www.cloudflare.com/resources-downloads#mod_cloudflare

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14985518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档