【问题标题】:Get correct visitor IP through CloudFlare通过 CloudFlare 获取正确的访问者 IP
【发布时间】:2015-05-25 13:22:02
【问题描述】:

我正在使用从其他人那里转售给我的 cPanel。 这可能意味着我不能使用mod_cloudflare

我想获取访问者的 IP,而不是 CloudFlare IP。 我正在使用的代码部分:

$_SERVER['REMOTE_ADDR']

该行会得到云闪现的IP,而不是原始用户的IP。

有什么方法可以从访问者那里获取原始 IP 地址?

【问题讨论】:

标签: php cloudflare


【解决方案1】:

Akam 的答案太复杂,不起作用。 这是一个更简单的方法:

if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
  $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}

【讨论】:

  • @hudson-taylor 你能详细说明这个答案吗?不确定如何/在哪里实施。
  • @Jay 不幸的是,不是。我只是帮助修复了这个答案的一些语法和/或格式;我实际上并没有帮助编写代码:( Denis Ragusoz 可能是一个更好的人问。
  • @denis-raguzov ?
【解决方案2】:

我在我的应用程序中使用了以下函数:http://ipaddress.standingtech.com/ 排除 CloudFlare IP address

<?php

/*
 * @param $ips = array of IP address
 */
function clear_flare_ips($ips){
  foreach($ips as $index => $ip){
    if(is_in_flareips($ip)){
      unset($ips[$index]);
    }
  }
  ksort($ips);
  return $ips;
}

function is_in_flareips($ip){
 $flareips = getflareips();
 foreach($flareips as $range){
   if(ip_in_range( $ip, $range )){
    return true;
   }
 }
 return false;
}

function getallips(){
      if (isset($_SERVER['HTTP_CLIENT_IP']))
          $ipaddress[] = $_SERVER['HTTP_CLIENT_IP'];
      if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
          $ipaddress[] = $_SERVER['HTTP_X_FORWARDED_FOR'];
      if(isset($_SERVER['HTTP_X_FORWARDED']))
          $ipaddress[] = $_SERVER['HTTP_X_FORWARDED'];
      if(isset($_SERVER['HTTP_FORWARDED_FOR']))
          $ipaddress[] = $_SERVER['HTTP_FORWARDED_FOR'];
      if(isset($_SERVER['HTTP_FORWARDED']))
          $ipaddress[] = $_SERVER['HTTP_FORWARDED'];
      if(isset($_SERVER['REMOTE_ADDR']))
          $ipaddress[] = $_SERVER['REMOTE_ADDR'];
      if(count($ipaddress) == 0)
          $ipaddress[] = 'UNKNOWN';
      return $ipaddress;
}

function getflareips(){
  /*
  https://www.cloudflare.com/ips-v4
  */
  return array(
  '103.21.244.0/22',
  '103.22.200.0/22',
  '103.31.4.0/22',
  '104.16.0.0/12',
  '108.162.192.0/18',
  '131.0.72.0/22',
  '141.101.64.0/18',
  '162.158.0.0/15',
  '172.64.0.0/13',
  '173.245.48.0/20',
  '188.114.96.0/20',
  '190.93.240.0/20',
  '197.234.240.0/22',
  '198.41.128.0/17',
  '199.27.128.0/21'
  );
}

function ip_in_range( $ip, $range ) {
/**
 * Check if a given ip is in a network
 * @param  string $ip    IP to check in IPV4 format eg. 127.0.0.1
 * @param  string $range IP/CIDR netmask eg. 127.0.0.0/24, also 127.0.0.1 is accepted and /32 assumed
 * @return boolean true if the ip is in this range / false if not.
 */
    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 ) );
}

【讨论】:

    【解决方案3】:

    是的,但是without access to the server configuration,您将无法使用$_SERVER['REMOTE_ADDR']

    但是,您可以still use X-Forwarded-For and CF-Connecting-IP。两者都可以在$_SERVER 超级全局中使用。

    【讨论】:

    • $_SERVER['HTTP_X_FORWARDED_FOR'] 这会给我解析错误:语法错误,意外
    • @Jeroen 这不是$_SERVER[..] 的问题,您编写的代码中有一个语法错误
    • pastebin.com/LtFKChxD 这是代码的一部分,如果我将第三行更改为: $fname2 = $_SERVER['HTTP_X_FORWARDED_FOR'] // 或: $fname2 = $ip=$_SERVER[' HTTP_X_FORWARDED_FOR']; // 都会报错
    • 这超出了我的知识范围哈哈,​​问题是它可以与 $_SERVER['REMOTE_ADDR'] 一起使用,但如果我只是替换该部分,它会给出错误。
    • 我无法修复它,我使用 $_SERVER['REMOTE_ADDR'] 没有问题,但是使用 $_SERVER['HTTP_X_FORWARDED_FOR'] 时会出现无法解释的语法错误
    猜你喜欢
    • 2013-02-05
    • 2015-02-09
    • 2013-03-28
    • 2015-12-31
    • 2019-02-10
    • 2013-04-03
    • 1970-01-01
    • 2016-01-27
    • 2019-10-14
    相关资源
    最近更新 更多