HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR有什么区别?

时间:2011-09-16 13:41:03

标签: http proxy header ip-address

据我所知,代理服务器设置了标头HTTP_X_FORWARDED_FOR,以识别通过代理发出HTTP请求的主机的IP地址。我听说过标题HTTP_CLIENT_IP是出于类似目的设置的。

  1. HTTP_CLIENT_IPHTTP_X_FORWARDED_FOR之间的区别是什么?
  2. 为什么一个人的价值观与另一个人不同?
  3. 我在哪里可以找到有关这些标题的确切定义的资源。

2 个答案:

答案 0 :(得分:53)

这些标题都没有正式标准化。因此:

  1. What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR? - 这是不可能的。不同的代理可以实现这些,也可以不实现。实现可能因代理而异,也可能不同。缺乏标准会产生问号。
  2. Why would one have different values than the other? - 请参阅第1点。但是,从纯粹实际的角度来看,我可以看到这些具有不同值的唯一原因是,如果涉及多个代理 - X-Forwarded-For:标题然后可能包含转发链的完整跟踪,而Client-IP:标头将包含实际的客户端IP。然而,这是纯粹的推测。
  3. Where can I find resources on the exact definition of these headers. - 你做不到。见第1点。
  4. 关于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;
}