Как получить внешний IP-адрес моего сервера с помощью PHP?
Я часто слышу, как люди говорят, чтобы использовать "$_SERVER['SERVER_ADDR']
", но это возвращает LAN IP моего сервера (например, 192.168.1.100). Мне нужен внешний IP.
11 ответов
просто запросите хост, который возвращает ваш 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-адрес или заплатите кому-нибудь за его размещение. Do не использовать чужой сервер без разрешения. Ранее этот ответ был связан с моей службой, которая теперь попадает несколько раз в секунду.
обратите внимание, что в IP-сети с одним или несколькими NATs, возможно несколько внешние IP-адреса. Это даст вам только один из них.
кроме того, это решение, конечно, зависит от наличия удаленного хоста. Однако, поскольку нет широко реализованного стандарта (нет ISP и только некоторые домашние маршрутизаторы реализуют UPnP), другого пути нет чтобы получить внешний IP-адрес. Даже если бы вы могли поговорить со своим местным NAT, вы не могли быть уверены, что за ним нет другого Ната.
нет способа получить ваш базовый IP-адрес, который был назначен вашим провайдером через обычный PHP, если вы используете маршрутизатор. Способ получить внешний IP-адрес-найти службу, которая получит его для вас и Эхо-адрес обратно к вам. Я нашел удобный сервис, который делает именно это. http://ipecho.net/
вы можете использовать:
$realIP = file_get_contents("http://ipecho.net/plain");
вы могли разобрать его от службы, как ип6.мне:
<?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;
Я собираюсь добавить решение, потому что другие были не совсем правы для меня, потому что они:
- необходимо запустить на сервере с доменным именем, например
gethostbyname()
(Если вы думаете об этом, у вас на самом деле нет проблемы, если вы знаете это априори) - не может использоваться на CLI (полагайтесь на что-то в
$_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-адрес есть Google public DNS сервер. Я верю, что они будут рядом и будут управлять им какое-то время. На самом деле не имеет значения, какой адрес вы используете там, пока его публичный IP-адрес принадлежит кому-то, кто не разум случайных попыток соединения слишком много (возможно, вы сами?).
это основано на ответ я столкнулся, когда у меня была аналогичная проблема в Python.
P. S.: Я не уверен, насколько хорошо это работает, если есть волшебство происходит между вашим компьютером и интернетом.
вы можете попробовать это:
$ip = gethostbyname('www.example.com');
echo $ip;
получить IP-адрес, связанный с вашим доменным именем.
Я знаю, что этот вопрос старый и длинный ответ, но я гуглил то же самое и хочу добавить свой собственный "Хак". Для этого ваш webrequest должен поступать с внешнего 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;
?>
Если у вашего сервера есть доменное имя, вы можете пинговать его или использовать:
$sMyServerIP = gethostbyname('yourdomain.com');
echo $sMyServerIP;
он вернет ваш внешний IP-адрес.
предполагая, что ваш PHP работает на сервере Linux, вы можете вызвать ifconfig, используя функцию exec PHP. Это даст публичный 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>';
}
обратите внимание, что иногда в качестве $command вы должны указать полный путь ifconfig. Вы можете найти это, выполнив
гденаходится команду ifconfig
из командной строки. Кроме того, $ interface должен быть установлен на имя основной сети вашего сервера интерфейс, который имеет ссылку на WAN.
в Windows вы можете сделать что-то подобное, конечно, используя ipconfig вместо ifconfig (и соответствующее скорректированное регулярное выражение).
также вы можете получить 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, который, возможно, лучше.
Я думаю, что для этого есть много кода в других ответах, но мой ответ короткий, но вам нужно выполнить команду в shell, чтобы получить ip...
но он короткий и быстрый, я думаю, что...
PHP для выполнения баш > в bash выполнить > Баш получить IP-адрес > в PHP получить IP-адрес
echo shell_exec( "dig +short myip.opendns.com @resolver1.opendns.com");
извините меня за мой английский, я надеюсь, что это поможет всем вам...
ссылки: как я могу получить свой внешний IP-адрес в сценарии оболочки?