@djienbaev97

Как правильно взять IP адрес пользователя?

5e50f943e659e188195860.png

ну я вот так при входе на сайт сохраняю IP адрес пользователя, но тут у меня сохраняет IP адрес хостинга в которой мой сайт лежит. Что не так? Как взять IP пользователя? У меня только один ip сохраняет, и это ip хостинга
  • Вопрос задан
  • 1180 просмотров
Пригласить эксперта
Ответы на вопрос 3
zkrvndm
@zkrvndm
Архитектор решений
Таким образом, для того, чтобы в PHP узнать IP клиента гарантированно, можно использовать следующую конструкцию:
<?php
 
$client  = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote  = @$_SERVER['REMOTE_ADDR'];
 
if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client;
elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward;
else $ip = $remote;
 
echo $ip;
 
?>

cccp-blog.com/koding/php-uznat-ip-adres
Ответ написан
@granty
Обычно, подобные вашему глюки возникают при использовании ELB (Elastic Load Balancer) хостером. Или когда сайт работает за реверс-прокси сервером (например, CloudFlare или хостеровский nginx).
Там в $_SERVER['HTTP_X_FORWARDED_FOR'] прилетает строка из нескольких IP:
"223.190.123.220, 66.102.6.83"
"2402:3a80:10d3:e19f:e7e1:8c35:fb4a:b49c, 66.102.6.89"
И, похоже, Yii::$app->request->userIP не знает как с ними поступать (в строке по сути невалидный IP, и filter_var($ip, FILTER_VALIDATE_IP) на нём обламывается).

Как правильно определять IP посетителя в таких случаях (и какие ещё грабли вас поджидают), отлично изложено на Хабре: REMOTE_ADDR vs HTTP_X_FORWARDED_FOR.
Вам надо узнать в какой переменной хостер присылает реальный IP посетителя, если он тупо добавляет её в $_SERVER['HTTP_X_FORWARDED_FOR'] - надо хотя бы узнать в начало или в конец. И выцеплять её оттуда.

PS: Я с Yii не работал, но скорее всего его можно "настроить" под вашу конкретику, там наверняка это предусмотрено. Посмотрите echo '<pre>'.print_r($_SERVER, true).'</pre>'; что и под какими именами прилетает, может ваш хостер использует нестандартные заголовки для передачи реального IP посетителя.

PPS: HTTP_X_FORWARDED_FOR в принципе нельзя использовать как IP-адрес. Если пользователь работает через свой прокси (или публичные Google-прокси, прокси Opera-mini и тп) - там бывает 3 IP-адреса и более, включая IPv6.
Ответ написан
Комментировать
@Asjacker
$_SERVER['REMOTE_ADDR'];
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы