Cloudflare выдает мне неправильный IP-адрес при использовании getenv (REMOTE_ADDR) - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть тестовый php-код. Который по сути захватывает IP-адрес кого-то и отправляет его по электронной почте на адрес. Позже я планирую сохранить его в базе данных, но только для целей тестирования я поставил его как электронное письмо.

Моя проблема в том, что у меня включен cloudflare, поэтому при использовании getenv(REMOTE_ADDR) он дает мне IP-адрес cloudflare, а не реальный IP-адрес посетителей. Есть ли способ получить IP-адрес посетителя?

<?php
$ip = getenv(REMOTE_ADDR);
mail("email@domain.com", "You got a visitor", "IP: ".$ip);
?>

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Если вы используете Nginx, вы также можете просто исправить это на уровне веб-сервера еще до того, как PHP подключится, и тогда $ip = getenv(REMOTE_ADDR); даст вам «реальный» IP-адрес посетителя. В nginx вы должны занести в белый список IP-адреса Cloudflare в файле nginx.conf, используя set_real_ip_from XXX для каждого из диапазонов IP-адресов Cloudflare.

Без исправления уровня веб-сервера я использовал:

if ($ip=='') $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];

Когда я исправил проблему регистрации IP на уровне веб-сервера, я использовал:

if ($ip=='') $ip = $_SERVER['REMOTE_ADDR'];
0 голосов
/ 17 сентября 2018

Конечно, Cloudflare скрывает реальный адрес вашего сервера от пользователя путем посредничества в соединении (обратный прокси-сервер), и с той же скоростью вы видите IP-адрес прокси-сервера, обращающийся к странице, а не пользователя.

Но они сообщают реальный IP через заголовки CF-Connecting-IP и других полезных заголовков. Cloudflare генерирует , чтобы выяснить реальное происхождение пользователя.

Попробуйте еще раз с $_SERVER['HTTP_CF_CONNECTING_IP'] вместо getenv(REMOTE_ADDR) ипосмотрим, что получится.

...