Nginx заменяет REMOTE_ADDR на X-Forwarded-For

Я довольно новичок в Nginx, и это кажется таким странным. У меня отлично настроен сервер, но проблема в том, что мой сервер защищен с помощью HTTP-прокси; вместо регистрации IP реальных пользователей, это регистрация IP прокси-сервера.

То, что я пытался сделать, это настройка $_SERVER['REMOTE_ADDR']; в $_SERVER['X-Forwarded-For']; но я получаю неопределенную ошибку индекса, так что я должен определить, X-Forwarded-For в Nginx? Но я не знаю, как это сделать, у меня есть простая установка, это просто Nginx с PHP. Ни больше ни меньше.

Я искал по всей сети, но на самом деле не могу найти информацию, которая понятна для понимания.

У меня есть доступ к исходному коду, если это несколько помогает. Я перепробовал много решений, но безрезультатно.

16

Решение

Правильный способ сделать это, установив real_ip_header Конфигурация в Nginx.

Пример с доверенным HTTP прокси IP:

set_real_ip_from 127.0.0.1/32;
real_ip_header X-Forwarded-For;

Таким образом, $ _SERVER [‘REMOTE_ADDR’] будет правильно заполнен в PHP fastcgi.

Ссылка на документацию — nginx.org

13

Другие решения

$http_x_forwared_for может содержать несколько IP-адресов, где первым должен быть IP-адрес клиента. REMOTE_ADDR должен быть только клиент ip.

Так что с помощью регулярных выражений в вашем nginx.confВы можете установить REMOTE_ADDR до первого ip из $http_x_forwarded_for вот так:

  set $realip $remote_addr;
if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") {
set $realip $1;
}
fastcgi_param REMOTE_ADDR $realip;
8

Дополнение к ответу @ fredrik.
Может быть лучше установить $realip с помощью map директива:

map $http_x_forwarded_for $realip {
~^(\d+\.\d+\.\d+\.\d+) $1;
default $remote_addr;
}

Затем установите fastcgi_param REMOTE_ADDR в fastcgi_params файл или блок местоположения:

fastcgi_param  REMOTE_ADDR          $real_ip;
1

Я решил свою собственную проблему, так как PHP фильтруется через FastCGI, я просто добавил быстрый параметр CGI, который устанавливает REMOTE_ADDR к переменной http_x_forwarded_forтак что-то похожее на это:

fastcgi_param REMOTE_ADDR $http_x_forwarded_for;
0
По вопросам рекламы [email protected]