В чем разница между HTTP_CLIENT_IP и HTTP_X_FORWARDED_FOR? - PullRequest
59 голосов
/ 16 сентября 2011

Я понимаю, что заголовок HTTP_X_FORWARDED_FOR устанавливается прокси-серверами для определения ip-адреса хоста, который делает HTTP-запрос через прокси.Я слышал заявления о том, что заголовок HTTP_CLIENT_IP установлен для аналогичных целей.

  1. В чем разница между HTTP_CLIENT_IP и HTTP_X_FORWARDED_FOR?
  2. Почему у них разныезначения, отличные от других?
  3. Где я могу найти ресурсы для точного определения этих заголовков.

Ответы [ 2 ]

56 голосов
/ 16 сентября 2011

Ни один из этих заголовков официально не стандартизирован. Поэтому:

  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:, поскольку он является "определяемым пользователем" заголовком.

1 голос
/ 06 апреля 2019

Вы также можете попробовать этот способ:

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;
}
...