Как мне получить внешний IP-адрес моего сервера с помощью PHP?
Я часто слышу, как люди говорят использовать "$_SERVER['SERVER_ADDR']
", но это возвращает IP-адрес локальной сети моего сервера (например, 192.168.1.100). Мне нужен внешний IP-адрес.
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.
Невозможно получить ваш базовый IP-адрес, который был назначен вашим провайдером, с помощью обычного PHP, если вы используете маршрутизатор. Способ получить внешний IP-адрес - это найти службу, которая получит его для вас и вернет вам адрес. Я нашел удобный сервис, который делает именно это. http://ipecho.net/
Вы можете использовать:
$realIP = file_get_contents("http://ipecho.net/plain");
Вы могли бы проанализировать его из службы, такой как 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;
Я собираюсь добавить решение, потому что другие не совсем подходили мне, потому что они:
- необходимо запускать на сервере с доменным именем, например
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.: Я не уверен, насколько хорошо это будет работать, если между вашей машиной и Интернетом происходит колдовство.
Вы могли бы попробовать это:
$ip = gethostbyname('www.example.com');
echo $ip;
Чтобы получить IP-адрес, связанный с вашим доменным именем.
Я знаю, что этот вопрос устарел и на него давно дан ответ, но я искал в гугле то же самое и хочу добавить свой собственный "хак". Чтобы это сработало, ваш веб-запрос должен исходить с внешнего 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, используя функцию 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 (и соответствующее скорректированное регулярное выражение).
Также вы можете получить 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, который, возможно, лучше.
Я думаю, что в других ответах есть много кода для этого, но мой ответ короткий, но вам нужно выполнить команду в оболочке, чтобы получить ip...
Но это коротко и быстро, я думаю, что...
Php выполнить bash > запустить bash > bash получить ip> php получить ip
echo shell_exec( "dig +short myip.opendns.com @resolver1.opendns.com");
Извините меня за мой английский, я надеюсь, что это поможет всем вам...
Ссылка: Как я могу получить свой внешний IP-адрес в сценарии оболочки?
Вы пробовали:
gethostbyname(php_uname('n'));
?