Ответы:
Вот так для ip сервера:
$_SERVER['SERVER_ADDR'];
и это для порта
$_SERVER['SERVER_PORT'];
John K
Вместо этого используйте ответ
Если вы используете PHP версии 5.3 или выше, вы можете сделать следующее:
$host= gethostname();
$ip = gethostbyname($host);
Это хорошо работает, когда вы запускаете автономный сценарий, а не через веб-сервер.
/etc/hosts
файле, и оно будет быстрым, хотя может и просто быть 127.0.0.1
. Если он действительно должен вызвать DNS, он будет медленным, как вы говорите.
например:
$_SERVER['SERVER_ADDR']
когда вы используете IIS, попробуйте:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
доступен только в IIS, когда PHP работает как модуль CGI.
Я зашел на эту страницу в поисках способа получить свой собственный IP-адрес, а не 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? )
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
Ни один из ответов, получивших наибольшее количество голосов, не вернет публичный адрес сервера. В общем-то$_SERVER['SERVER_ADDR']
это будет правильно, но если вы обращаетесь к серверу через VPN, он, скорее всего, вернет внутренний сетевой адрес, а не публичный адрес, и даже если не в той же сети, некоторые конфигурации будут просто пустыми или будут указаны другие стоимость.
Аналогичным образом, существуют сценарии, в которых $host= gethostname(); $ip = gethostbyname($host);
не будут возвращены правильные значения, поскольку он полагается как на DNS (внутренне настроенные или внешние записи), так и на настройки имени хоста сервера для экстраполяции IP-адреса сервера. Оба эти шага потенциально ошибочны. Например, если имя хоста сервера отформатировано как имя домена (т.е. HOSTNAME=yahoo.com
), то (по крайней мере, в моей настройке php5.4 / Centos6) сразу gethostbyname
перейдет к поиску адреса Yahoo.com, а не локального сервера.
Кроме того, из-за того, что gethostbyname
к общедоступным записям DNS возвращается тестовый сервер с неопубликованными или неверными общедоступными записями DNS (например, вы получаете доступ к серверу по localhost
IP-адресу или если вы переопределяете общедоступный DNS с помощью локального hosts
файла), тогда вы Я верну либо отсутствие IP-адреса (он просто вернет имя хоста), либо, что еще хуже, вернет неправильный адрес, указанный в общедоступных записях DNS, если он существует, или если есть подстановочный знак для домена.
В зависимости от ситуации вы также можете попробовать третий подход, сделав что-то вроде этого:
$external_ip = exec('curl http://ipecho.net/plain; echo');
У этого есть свои недостатки (зависит от конкретного стороннего сайта, и могут быть настройки сети, которые маршрутизируют исходящие соединения через другой хост или прокси), и вроде бы gethostbyname
это может быть медленным. Честно говоря, я не уверен, какой подход будет правильным чаще всего, но урок, который нужно усвоить, заключается в том, что конкретные сценарии / конфигурации приведут к неправильным результатам для всех этих подходов ... поэтому, если возможно, убедитесь, что подход, который вы using возвращает ожидаемые значения.
Это то, что вы могли бы использовать в качестве адаптации приведенных выше примеров, не беспокоясь о том, что 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);
?>
Если вы используете PHP в оболочке bash, вы можете использовать:
$server_name=exec('hostname');
Потому что $_SERVER[] SERVER_ADDR
, HTTP_HOST
и SERVER_NAME
не установлены.
Я обнаружил, что это работает для меня: GetHostByName ("");
Запуск XAMPP v1.7.1 в Windows 7 с веб-сервером Apache. К сожалению, он просто дает IP-адрес моего шлюза.
Я только что создал простой скрипт, который вернет $ _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']; }
Проверьте массив $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
не имеет ничего общего с заголовками HTTP. Он заполняется серверным программным обеспечением, все связанные с HTTP вещи в $ _SERVER имеют префикс HTTP_. php.net/manual/en/reserved.variables.server.php
Как это:
$_SERVER['SERVER_ADDR'];