Почему $ SERVER ["REMOTE ADDR"] показывает другой IP, чем мой внешний IP? [дубликат]
Возможные Дубликаты:
внезапно $_SERVER ['REMOTE_ADDR'] начинает возвращать 10.10.10.10 php
Я, должно быть, пропустил здесь какую-то фундаментальную вещь.. Но когда я перехожу на сайт IP-отображения, такой какhttp://www.whatsmyip.org/ они показывают определенный IP. Но когда я отзовусь эхом ... --0--> на странице, на моем сайте он показывает другой IP.
почему это? И как я могу, через PHP, получить то же самое IP что то whatsmyip.org сайт показывает?
6 ответов
Если ваш компьютер находится в одной сети с сервером, за маршрутизатором с NAT, то вы можете увидеть ваш частный IP
во-первых, позвольте мне прояснить несколько вещей.
когда ваш на localhost ваш не использует ваш ISP для получения веб-страницы, таким образом, вы будете использовать внутренний ip 127.0.0.1
или ::1
для ipv6.
если вы получаете страницу из локальной сети через какой-либо маршрутизатор, у вас будет ip-адрес, назначенный маршрутизатором, например 192.168.1.90
если ваш сайт размещен за пределами сети, то вы попросите вашего интернет-провайдера принести сайт для вас, то есть вы получите использовать IP указанный whatsmyip.
если вы используете DNS-сервер, такой как Opendns, то вы просите своего провайдера попросить Opendns принести сайт для вас, а open dns использует набор ip-адресов, которые отличаются от Ваших по очевидным причинам.
может быть какой-то прокси-сервер, который может вмешиваться, поэтому вы должны сделать счетчик для этого, стандартный прокси-сайт должен пересылать IP-адрес клиентов на сервер в случае любых прямых соединений, необходимых и для нескольких других причины.
это, как говорится, вы обычно можете найти IP, проверив несколько других параметров, прежде чем проверять REMOTE_ADDR
, вот это класс, я создал для одного из моих проектов, но вы можете просто взять то, что вам нужно:
https://github.com/AdminSpot/ASDDL/blob/master/system/classes/http/request.php
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key)
{
if (array_key_exists($key, $_SERVER) === true)
{
foreach (explode(',', $_SERVER[$key]) as $ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP) !== false)
{
$this->ip = $ip;
break;
}
}
}
}
как вы можете видеть, порядок массива очень важно:
- как настроен
- HTTP_X_FORWARDED_FOR
- HTTP_X_FORWARDED
- HTTP_X_CLUSTER_CLIENT_IP
- HTTP_FORWARDED_FOR
- HTTP_FORWARDED
- REMOTE_ADDR
уведомления REMOTE_ADDR
приходит последним, это потому, что это последнее средство, и большую часть времени неправильно.
когда ваш веб-сервер находится на вашем локальном компьютере, он даст вам ваш локальный IP-адрес в основном 127.0.0.1, потому что вы не получаете к нему доступ извне. Это причина.
Если ваш сервер Apache и вы используете какой-то интерфейс перед Apache, вы можете попробовать использовать модулем mod_rpaf:
В Debian:aptitude install libapache2-mod-rpaf
затем отредактируйте config:nano /etc/apache2/mods-enabled/rpaf.conf
<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
</IfModule>
Это может быть потому, что вы посещаете его с localhost? Это IP вы видите 127.0.0.1 или ваш локальный IP (192.168.х.х)?