使用PHP获取客户端IP地址

use*_*627 192 php ip-address

我想获得使用我的网站的客户端IP地址.我正在使用PHP $_SERVER超全局:

$_SERVER['REMOTE_ADDR'];
Run Code Online (Sandbox Code Playgroud)

但我发现使用它无法提供正确的IP地址.我得到了我的IP地址,看到它与我的IP地址不同,我也可以在某些网站上看到我的IP地址,例如:

http://whatismyipaddress.com/
Run Code Online (Sandbox Code Playgroud)

我粘贴了我的PHP函数的IP地址,但是这个网站没有显示结果.这个问题是如何产生的,如何获得客户端的IP地址?

小智 347

获取访问者/客户端IP地址的最简单方法是使用$_SERVER['REMOTE_ADDR']$_SERVER['REMOTE_HOST']变量.

但是,有时这不会返回访问者的正确IP地址,因此我们可以使用其他一些服务器变量来获取IP地址.

以下两个函数仅相同,只取决于检索值的方式和位置.

getenv()用于获取PHP中环境变量的值.

// Function to get the client IP address
function get_client_ip() {
    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
       $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}
Run Code Online (Sandbox Code Playgroud)

$ _SERVER是一个包含Web服务器创建的服务器变量的数组.

// Function to get the client IP address
function get_client_ip() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此功能也可能导致您非常错误.特别是,HTTP_X_FORWARDED_FOR可以是客户选择设置的任何内容,而REMOTE_ADDR则很难伪造,如果客户想要获得实际响应. (35认同)
  • 在你被黑客入侵之前,你需要阅读这个**:http://stackoverflow.com/questions/3003145/how-to-get-the-client-ip-address-in-php#comment50230065_3003233 (5认同)
  • 这段代码容易受到欺骗,请小心使用它! (4认同)
  • 而且,即使它不是伪造的,也有很多设置只会填充客户端内部网络ip,这将是无用的. (3认同)
  • @huykon225 因为你在本地主机。尝试在服务器上上传脚本。 (2认同)

Mic*_*ael 120

在PHP 5.3或更高版本中,您可以这样得到它:

$ip = getenv('HTTP_CLIENT_IP')?:
getenv('HTTP_X_FORWARDED_FOR')?:
getenv('HTTP_X_FORWARDED')?:
getenv('HTTP_FORWARDED_FOR')?:
getenv('HTTP_FORWARDED')?:
getenv('REMOTE_ADDR');
Run Code Online (Sandbox Code Playgroud)

  • 如果未设置变量,getenv将返回false,如果未设置变量,则$ _SERVER将使用"undefined index"出错. (7认同)
  • 我通常不喜欢嵌套的三元组,但在这种情况下我真的很喜欢它... (4认同)
  • GeriBoss,要弄清楚这个phpsadness测试用例的解决方案并让代码在同一时间更具可读性并不是那么难:echo(FALSE?"a":( FALSE?"b":"c"))." N"; echo(FALSE?"a":( TRUE?"b":"c"))."\n"; echo(TRUE?"a":( FALSE?"b":"c"))."\n"; echo(TRUE?"a":( TRUE?"b":"c"))."\n"; (3认同)
  • 这对我有用,因为标记为正确答案的那个没有. (2认同)
  • 我倾向于在PHP中完全避免三元组导致其(不合逻辑的)左关联性.请参见http://phpsadness.com/sad/30 (2认同)