Nginx заменит REMOTE_ADDR на X-Forwarded-For
Я совершенно новичок в Nginx, и, похоже, все так запутанно. Я отлично настроил сервер, но проблема в том, что мой сервер защищен с использованием HTTP-прокси; вместо того, чтобы регистрировать IP-адреса реальных пользователей, он регистрирует IP-адрес прокси-сервера.
То, что я пытался сделать, это установить $_SERVER['REMOTE_ADDR'];
в $_SERVER['X-Forwarded-For'];
, но я получаю индексную ошибку undefined, поэтому я предполагаю, что мне нужно определить X-Forwarded-For
в Nginx? Но я не знаю, как это сделать, у меня простая настройка, это просто Nginx с PHP. Ничего больше, не меньше.
Я искал по всему Интернету, но на самом деле не могу найти некоторую информацию, которая будет понятна.
У меня есть доступ к исходному коду, если это немного помогает. Я пробовал много решений, но безуспешно.
Ответы
Ответ 1
Правильный способ сделать это - установить конфигурацию 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
Ответ 2
$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;
Ответ 3
Дополнение к ответу @fredrik.
Возможно, лучше установить $real_ip
с помощью директивы map
:
map $http_x_forwarded_for $real_ip {
~^(\d+\.\d+\.\d+\.\d+) $1;
default $remote_addr;
}
Затем установите fastcgi_param REMOTE_ADDR
в файл fastcgi_params
или блок местоположения:
fastcgi_param REMOTE_ADDR $real_ip;
edit: опечатка исправлена в имени переменной
Ответ 4
Я решил свою проблему, так как PHP фильтруется через FastCGI, я просто добавил быстрый параметр CGI, который устанавливает REMOTE_ADDR
в переменную http_x_forwarded_for
, поэтому что-то похожее на это:
fastcgi_param REMOTE_ADDR $http_x_forwarded_for;
Ответ 5
У меня была такая же проблема. Вы правы, вы должны добавить параметр fastcgi:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param CUSTOM_PARAM "CUSTOM_VALUE";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
fastcgi_param REMOTE_ADDR $http_x_real_ip;
}
По умолчанию параметр REMOTE_ADDR указан в /etc/nginx/fastcgi_params
:
fastcgi_param REMOTE_ADDR $remote_addr;
Это не значение, которое происходит из заголовка прокси-прохода.
Убедитесь, что вы изменили его в файле fastcgi_params
или установите его после оператора include.