$ipaddress = '';
if ( getenv('HTTP_CLIENT_IP') ) {
$ipaddress = getenv('HTTP_CLIENT_IP');
} else if( getenv('HTTP_X_FORWARDED_FOR') ) {
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
$ipaddress = explode(",", $ipaddress);
$ipaddress = $ipaddress[0];
} 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 ip2long($ipaddress);
http_client_ip - null
http_x_forwarded_for - 2604:2000:6147:df00:25ee:04a4:ea44:6947, 162.158.62.236
http_x_forwarded - null
http_forwarded_for - null
http_forwarded - null
remote_addr 112.121.183.210
嗨,我是ip的新手,不知道如何获得真正的IP地址。
我不知道为什么http_x_forwarded_for
返回2 ip?
为什么http_x_forwarded_for
第一个包含字母?
为什么http_client_ip, http_x_forwarded, http_forwarded_for, http_forwarded
为空?
为什么remote_addr
与http_x_forwarded_for
不同?
哪一个是正确的IP地址
答案 0 :(得分:1)
如果您正在处理代理,那么只要转发请求,这些代理就可以添加X-Forwarded-For标头。例如:
client -> proxy -> proxy -> server
这里有两个代理,可能一个在客户端,一个在服务器的数据中心,或者在客户端,或者在数据中心,或者你遇到的任何其他组合。
然后,您的服务器(PHP)将远程IP视为最近的代理。这就是从它获得“物理”连接的地方。
为了好,两个代理都将他们获取请求的地址添加到HTTP头。 “字母”地址是IPv6 address。
如果你知道谁设置了这些标题,你应该只信任这些标题。唯一有保证的地址是REMOTE_ADDR
,因为这是实际的连接。其他人只是任何人都可以设置的HTTP标头,包括客户端本身。除非您知道自己的数据中心有代理,并且知道它准确设置了哪个标头,否则您应该忽略它们。