it-swarm.cn

HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR有什么区别?

我知道代理服务器设置头HTTP_X_FORWARDED_FOR来识别通过代理发出HTTP请求的主机的ip地址。我听说过标题HTTP_CLIENT_IP是为了类似的目的设置的。

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

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

  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点。

似乎有 某种事实上的标准 关于X-Forwarded-For:标题,但是 鉴于没有定义它的RFC,这是不可靠的 见下面的评论。

作为旁注,Client-IP:标头按惯例应为X-Client-IP:,因为它是“用户定义的”标头。

53
DaveRandom

您也可以尝试这种方式:

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;
}
0
bharat