【问题标题】:I need get the IP address我需要获取 IP 地址
【发布时间】:2010-12-13 09:02:55
【问题描述】:

我需要使用 PHP 获取跨代理的用户 IP 地址... 有什么建议吗?

【问题讨论】:

  • 你确定可以用谷歌搜索这个吗?
  • 给他答案,而不是那种愚蠢的cmets。
  • 这个问题在 SO 上有很多重复。
  • @Pekka:不要只告诉我们有重复而不告诉我们。

标签: php proxy


【解决方案1】:

通常代理会添加特定的标头X-Forwarded-For,您可以通过服务器变量$_SERVER['HTTP_X_FORWARDED_FOR']在PHP中检查它

【讨论】:

    【解决方案2】:

    这是一件很难的事情,而且并非所有代理都会提供用户的真实 IP。我写了这个函数,之前它试图找到最有可能的用户 IP:

    function get_ip_address() {
    
        if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_CLIENT_IP']))
            return $_SERVER['HTTP_CLIENT_IP'];
        elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_COMING_FROM']))
            return $_SERVER['HTTP_COMING_FROM'];
        elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_COMING_FROM']))
            return $_SERVER['HTTP_X_COMING_FROM'];
        elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_FORWARDED']))
            return $_SERVER['HTTP_FORWARDED'];
        elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_FORWARDED']))
            return $_SERVER['HTTP_X_FORWARDED'];
        elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_FORWARDED_FOR']))
            return $_SERVER['HTTP_FORWARDED_FOR'];
        elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_FORWARDED_FOR']))
            return $_SERVER['HTTP_X_FORWARDED_FOR'];
        else return $_SERVER['REMOTE_ADDR'];
    
    }
    

    如果您只是将 IP 存储在数据库或其他东西中,该函数只会返回 1 个 IP,但我有一个类似的函数,它提供基于文本的响应,其中包含找到的所有可能的 IP。

    function get_txt_ip_address() {
    
        $return = '';
    
        if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_CLIENT_IP']))
            $return .= $_SERVER['HTTP_CLIENT_IP']." (client) / ";
        if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_COMING_FROM']))
            $return .= $_SERVER['HTTP_COMING_FROM']." (cf) / ";
        if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_COMING_FROM']))
            $return .= $_SERVER['HTTP_X_COMING_FROM']." (xcf) / ";
        if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_FORWARDED']))
            $return .= $_SERVER['HTTP_FORWARDED']." (fw) / ";
        if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_FORWARDED']))
            $return .= $_SERVER['HTTP_X_FORWARDED']." (xfw) / ";
        if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_FORWARDED_FOR']))
            $return .= $_SERVER['HTTP_FORWARDED_FOR']." (fwf) / ";
        if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_FORWARDED_FOR']))
            $return .= $_SERVER['HTTP_X_FORWARDED_FOR']." (xfwf) / ";
    
        $return .= $_SERVER['REMOTE_ADDR']." (ra) / ";
        $return .= gethostbyaddr($_SERVER['REMOTE_ADDR']);
    
        return $return;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 2014-04-04
      • 1970-01-01
      • 2010-10-29
      • 2010-09-15
      • 2011-12-26
      • 1970-01-01
      • 2010-11-04
      • 2013-05-19
      相关资源
      最近更新 更多