Как мне получить внешний IP-адрес моего сервера с помощью PHP?


Я часто слышу, как люди говорят использовать "$_SERVER['SERVER_ADDR']", но это возвращает IP-адрес локальной сети моего сервера (например, 192.168.1.100). Мне нужен внешний IP-адрес.

 16
Author: Leo Jiang, 2011-10-27

11 answers

Просто запросите хост, который вернет ваш IP-адрес:

$externalContent = file_get_contents('http://checkip.dyndns.com/');
preg_match('/Current IP Address: \[?([:.0-9a-fA-F]+)\]?/', $externalContent, $m);
$externalIp = $m[1];

Или настройте службу, которая просто повторяет только IP-адрес, и используйте ее следующим образом:

$externalIp = file_get_contents('http://yourdomain.example/ip/');

Настройте услугу самостоятельно, просто повторив удаленный IP-адрес, или заплатите кому-нибудь за ее размещение. Не используйте чужой сервер без разрешения. Ранее этот ответ был связан с моей службой, которая теперь запускается несколько раз в секунду.

Обратите внимание, что в IP-сети с одним или несколькими NATs, у вас может быть несколько внешних IP-адресов. Это даст вам только один из них.

Кроме того, это решение, конечно, зависит от доступности удаленного хоста. Однако, поскольку широко внедренного стандарта не существует (нет провайдера, и только некоторые домашние маршрутизаторы реализуют UPnP), другого способа получить ваш внешний IP-адрес не существует. Даже если бы вы могли поговорить со своим местным NAT, вы не могли бы быть уверены, что за этим не стоит другой NAT.

 27
Author: phihag, 2015-07-27 04:20:32

Невозможно получить ваш базовый IP-адрес, который был назначен вашим провайдером, с помощью обычного PHP, если вы используете маршрутизатор. Способ получить внешний IP-адрес - это найти службу, которая получит его для вас и вернет вам адрес. Я нашел удобный сервис, который делает именно это. http://ipecho.net/

Вы можете использовать:

$realIP = file_get_contents("http://ipecho.net/plain");
 31
Author: Ben, 2016-11-21 14:44:53

Вы могли бы проанализировать его из службы, такой как ip6.me:

<?php

// Pull contents from ip6.me
$file = file_get_contents('http://ip6.me/');

// Trim IP based on HTML formatting
$pos = strpos( $file, '+3' ) + 3;
$ip = substr( $file, $pos, strlen( $file ) );

// Trim IP based on HTML formatting
$pos = strpos( $ip, '</' );
$ip = substr( $ip, 0, $pos );

// Output the IP address of your box
echo "My IP address is $ip";

// Debug only -- all lines following can be removed
echo "\r\n<br/>\r\n<br/>Full results from ip6.me:\r\n<br/>";
echo $file;
 6
Author: Patrick Moore, 2011-10-26 21:59:33

Я собираюсь добавить решение, потому что другие не совсем подходили мне, потому что они:

  • необходимо запускать на сервере с доменным именем, например gethostbyname() (если вы подумаете об этом, у вас на самом деле нет проблемы, если вы знаете это априори)
  • не может использоваться в командной строке (полагайтесь на что-то в $_SERVER, что должно быть установлено веб-сервером)
  • предполагайте определенный формат вывода ifconfig, который может включать несколько непубличных интерфейсов
  • зависит от анализа чьего-либо веб-сайта (кто может исчезнуть, изменить URL-адрес, изменить формат, начать лгать вам и т.д., и все это без предварительного уведомления)

Вот что я бы предложил:

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$res = socket_connect($sock, '8.8.8.8', 53);
// You might want error checking code here based on the value of $res
socket_getsockname($sock, $addr);
socket_shutdown($sock);
socket_close($sock);

echo $addr; // Ta-da! The IP address you're connecting from

IP-адрес есть Общедоступный DNS-сервер Google. Я верю, что они будут рядом и будут управлять им какое-то время. На самом деле не должно иметь значения, какой адрес вы там используете, если это общедоступный IP-адрес, принадлежащий кому-то, кто не слишком возражает против случайных попыток подключения (может быть, вы сами?).

Это основано на ответ Я наткнулся, когда у меня была аналогичная проблема в Python.


P.S.: Я не уверен, насколько хорошо это будет работать, если между вашей машиной и Интернетом происходит колдовство.

 5
Author: jeteon, 2017-05-23 12:10:08

Вы могли бы попробовать это:

$ip = gethostbyname('www.example.com');
echo $ip;

Чтобы получить IP-адрес, связанный с вашим доменным именем.

 4
Author: jakx, 2015-06-17 07:25:57

Я знаю, что этот вопрос устарел и на него давно дан ответ, но я искал в гугле то же самое и хочу добавить свой собственный "хак". Чтобы это сработало, ваш веб-запрос должен исходить с внешнего IP-адреса, или вы должны изменить $own_url на URL-адрес, который выполняет внешний запрос к самому себе.

Дело в том, что если вы позволите скрипту сделать запрос самому себе, то получите его внешний IP-адрес.

<?php
if (isset($_GET['ip'])) {
    die($_SERVER['REMOTE_ADDR']);
}
$own_url = (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
$ExternalIP = file_get_contents($own_url.'?ip=1');
echo $ExternalIP;
?>
 1
Author: Martin, 2017-07-25 12:55:34

Если у вашего сервера есть доменное имя, вы можете пропинговать его или использовать:

$sMyServerIP = gethostbyname('yourdomain.com');
echo $sMyServerIP;

Он вернет ваш внешний IP-адрес.

 0
Author: Codebeat, 2015-04-04 04:39:37

Предполагая, что ваш PHP работает на сервере Linux, вы можете вызвать ifconfig, используя функцию PHP exec. Это даст общедоступный IP-адрес без необходимости обращаться к какому-либо внешнему веб-сайту/сервису. Например:

$command = "ifconfig";  /// see notes below
$interface = "eth0";    // 
exec($command, $output);
$output = implode("\n",$output);
if ( preg_match('/'.preg_quote($interface).'(.+?)[\r\n]{2,}/s', $output, $ifaddrsMatch)
        && preg_match_all('/inet(6)? addr\s*\:\s*([a-z0-9\.\:\/]+)/is', $ifaddrsMatch[1], $ipMatches, PREG_SET_ORDER) )
{
    foreach ( $ipMatches as $ipMatch ) 
        echo 'public IPv'.($ipMatch[1]==6?'6':'4').': '.$ipMatch[2].'<br>';
}

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

Где ifconfig

Из командной строки. Кроме того, $interface должен быть установлен на имя основного сетевого интерфейса вашего сервера, который имеет ссылку в ВАННУЮ.

В Windows вы, конечно, можете сделать что-то подобное, используя ipconfig вместо ifconfig (и соответствующее скорректированное регулярное выражение).

 0
Author: Arthur, 2015-07-10 15:46:04

Также вы можете получить IP-адрес через DNS-запись, основанную на имени хоста или имени сервера:

$dnsARecord = dns_get_record($_SERVER['HTTP_HOST'],DNS_A);
if ( $dnsARecord ) echo 'IPv4: '.$dnsARecord[0]['ip'];
$dnsARecord = dns_get_record($_SERVER['HTTP_HOST'],DNS_AAAA);
if ( $dnsARecord ) echo 'IPv6: '.$dnsARecord[0]['ip'];

Вы также можете использовать ИМЯ_СЕРВЕРА вместо HTTP_HOST, если одно из двух не дает того, что вы хотите.

Однако это предполагает, что ваш сервер правильно настроен в соответствии с DNS. Это может быть не всегда так. Смотрите мой другой ответ, используя ifconfig, который, возможно, лучше.

 0
Author: Arthur, 2015-07-10 15:55:19

Я думаю, что в других ответах есть много кода для этого, но мой ответ короткий, но вам нужно выполнить команду в оболочке, чтобы получить ip...

Но это коротко и быстро, я думаю, что...

Php выполнить bash > запустить bash > bash получить ip> php получить ip

echo shell_exec( "dig +short myip.opendns.com @resolver1.opendns.com");

Извините меня за мой английский, я надеюсь, что это поможет всем вам...

Ссылка: Как я могу получить свой внешний IP-адрес в сценарии оболочки?

 0
Author: DarckBlezzer, 2017-08-11 17:29:38

Вы пробовали:

gethostbyname(php_uname('n'));

?

 -3
Author: Krunoslav Djakovic, 2015-03-19 22:01:20