Почему $ 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, потому что вы не получаете к нему доступ извне. Это причина.


Что такое IP?

мой единственный вопрос в том, что вы можете быть за прокси. Возможно ли это?


Если ваш сервер 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.х.х)?