据我所知,代理服务器设置了标头HTTP_X_FORWARDED_FOR
,以识别通过代理发出HTTP请求的主机的IP地址。我听说过标题HTTP_CLIENT_IP
是出于类似目的设置的。
HTTP_CLIENT_IP
和HTTP_X_FORWARDED_FOR
之间的区别是什么?答案 0 :(得分:53)
这些标题都没有正式标准化。因此:
What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR?
- 这是不可能的。不同的代理可以实现这些,也可以不实现。实现可能因代理而异,也可能不同。缺乏标准会产生问号。Why would one have different values than the other?
- 请参阅第1点。但是,从纯粹实际的角度来看,我可以看到这些具有不同值的唯一原因是,如果涉及多个代理 - X-Forwarded-For:
标题然后可能包含转发链的完整跟踪,而Client-IP:
标头将包含实际的客户端IP。然而,这是纯粹的推测。Where can I find resources on the exact definition of these headers.
- 你做不到。见第1点。关于X-Forwarded-For:
标题似乎有some kind of de-facto standard,但似乎没有定义它的RFC,这是不可靠的请参阅下面的评论。
作为旁注,Client-IP:
标题按惯例应为X-Client-IP:
,因为它是“用户定义的”标题。
答案 1 :(得分:0)
您也可以尝试这种方式:
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
$user_ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_X_FORWARDED'])) {
$user_ip = $_SERVER['HTTP_X_FORWARDED'];
} else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
$user_ip = $_SERVER['HTTP_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_FORWARDED'])) {
$user_ip = $_SERVER['HTTP_FORWARDED'];
} else if (isset($_SERVER['REMOTE_ADDR'])) {
$user_ip = $_SERVER['REMOTE_ADDR'];
} else {
$user_ip = null;
}