15 ответов:
Если вы используете PHP версии 5.3 или выше, вы можете сделать следующее:
$host= gethostname(); $ip = gethostbyname($host);Это хорошо работает, когда вы запускаете автономный скрипт, а не через веб-сервер.
ни один из самых популярных ответов не будет надежно возвращать публичный адрес сервера. Вообще
$_SERVER['SERVER_ADDR']будет правильно, но если вы получаете доступ к серверу через VPN, он, скорее всего, вернет внутренний сетевой адрес, а не публичный адрес, и даже если он не находится в той же сети, некоторые конфигурации будут просто пустыми или иметь какое-то другое указанное значение.кроме того, есть сценарии, где
$host= gethostname(); $ip = gethostbyname($host);не будет возвращать правильные значения, потому что он полагается на как на DNS (либо внутренне настроенные, либо внешние записи), так и на настройках имени хоста сервера для экстраполяции IP-адреса сервера. Оба эти шага потенциально неисправны. Например, если имя хоста сервера отформатировано как доменное имя (т. е.HOSTNAME=yahoo.com) тогда (по крайней мере, на моей установке php5.4/Centos6)gethostbynameсразу перейдем к поиску Yahoo.com ' s адрес, а не локальный сервер.кроме того, потому что
gethostbynameоткатывается на общедоступные DNS-записи тестирования сервер с неопубликованными или неверными публичными DNS-записями (например, вы обращаетесь к серверу поlocalhostили IP-адрес, или если вы переопределяете общедоступный DNS с помощью локальногоhostsfile), то вы получите обратно либо нет IP-адрес (он будет просто возвращать имя хоста) или еще хуже он будет возвращать неправильный адрес, указанный в публичных записях DNS, если он существует или если есть подстановочный знак для домена.в зависимости от ситуации, вы также можете попробовать третий подход делаю что-то вроде этого:
$external_ip = exec('curl http://ipecho.net/plain; echo');это имеет свои недостатки (зависит от конкретного стороннего сайта, и могут быть сетевые настройки, которые маршрутизируют исходящие соединения через другой хост или прокси-сервер) и как
gethostbynameэто может быть медленно. Я честно не уверен, какой подход будет правильным чаще всего, но урок, который нужно принять близко к сердцу, заключается в том, что конкретные сценарии/конфигурации приведут к неправильным выводам для всех этих подходов... поэтому, если возможно, проверьте, что подход вы использование возвращает значения, которые вы ожидаете.
Я пришел на эту страницу, ища способ получить свой собственный ip-адрес, а не один из удаленной машины, подключенной ко мне.
Это не будет работать для машины windows.
но в случае, если кто-то ищет то, что я искала:
#! /usr/bin/php <?php $my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'"); echo $my_current_ip;(нагло взято из как я могу получить основной IP-адрес локальной машины на Linux и OS X?)
Регистрация переменная$_SERVER массив
echo $_SERVER['SERVER_ADDR'];
если вы используете PHP в оболочке bash, вы можете использовать:
$server_name=exec('hostname');, потому что
$_SERVER[] SERVER_ADDR,HTTP_HOSTиSERVER_NAMEне установлены.
все предыдущие ответы дают $_SERVER ['SERVER_ADDR']. Это не будет работать на некоторых установках IIS. Если вы хотите, чтобы это работало на IIS, используйте следующее:
$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
Это то, что вы можете использовать в качестве адаптации вышеприведенных примеров, не беспокоясь о curl, установленном на вашем сервере.
<?php // create a new cURL resource $ch = curl_init (); // set URL and other appropriate options curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain"); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); // grab URL and pass it to the browser $ip = curl_exec ($ch); echo "The public ip for this server is: $ip"; // close cURL resource, and free up system resources curl_close ($ch); ?>
Я только что создал простой скрипт, который вернет $_SERVER['REMOTE_ADDR'] и $_SERVER['SERVER_ADDR'] в IIS, поэтому вам не нужно менять каждую переменную. Просто вставьте этот текст в свой php файл, который включен в каждую страницу.
/** IIS IP Check **/ if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; } if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
можно использовать
$HTTP_SERVER_VARS['server_ADDR']Если вы ничего не получаете от ответов выше, и если вы используете более старую версию PHP
Я нашел, что это работает для меня: GetHostByName ("");
запуск XAMPP v1.7.1 в Windows 7 под управлением веб-сервера Apache. К сожалению, он просто дает мой IP-адрес шлюза.
Comments