【发布时间】:2010-12-13 09:02:55
【问题描述】:
我需要使用 PHP 获取跨代理的用户 IP 地址... 有什么建议吗?
【问题讨论】:
-
你确定可以用谷歌搜索这个吗?
-
给他答案,而不是那种愚蠢的cmets。
-
这个问题在 SO 上有很多重复。
-
@Pekka:不要只告诉我们有重复而不告诉我们。
我需要使用 PHP 获取跨代理的用户 IP 地址... 有什么建议吗?
【问题讨论】:
通常代理会添加特定的标头X-Forwarded-For,您可以通过服务器变量$_SERVER['HTTP_X_FORWARDED_FOR']在PHP中检查它
【讨论】:
这是一件很难的事情,而且并非所有代理都会提供用户的真实 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;
}
【讨论】: