Как я могу определить IP-адрес сервера в PHP?
Как определить IP-адрес сервера в PHP
Ответы (14)
Например, для IP-адреса сервера:
$_SERVER['SERVER_ADDR'];
а это для порта
$_SERVER['SERVER_PORT'];
John K
- person Ariel; 12.02.2015
John K
, лучше использовать gethostbyname(gethostname());
- person David; 19.03.2019
@JohnK
решение с соответствующей ссылкой, либо хотя бы дать ссылку на существующее решение. Ваше здоровье!
- person Fr0zenFyr; 05.07.2019
Если вы используете PHP версии 5.3 или выше, вы можете сделать следующее:
$host= gethostname();
$ip = gethostbyname($host);
Это хорошо работает, когда вы запускаете автономный скрипт, а не через веб-сервер.
/etc/hosts
и будет быстрым, хотя может быть просто 127.0.0.1
. Если ему действительно нужно вызывать DNS, то он будет медленным, как вы говорите.
- person Ariel; 12.02.2015
Например:
$_SERVER['SERVER_ADDR']
когда вы на IIS, попробуйте:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
доступен только в IIS, когда PHP работает как модуль CGI.
- person Rudi Visser; 27.04.2011
Я пришел на эту страницу в поисках способа получить свой собственный 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\.'
- person Jonathan; 26.07.2019
Ни один из ответов, получивших наибольшее количество голосов, не будет надежно возвращать публичный адрес сервера. Как правило, $_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);
?>
Все предыдущие ответы дают $_SERVER['SERVER_ADDR']. Это не будет работать на некоторых установках IIS. Если вы хотите, чтобы это работало на IIS, используйте следующее:
$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
Если вы используете 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']; }
Возможно, вам придется использовать $HTTP_SERVER_VARS['server_ADDR']
, если вы не получаете ничего из приведенных выше ответов и если вы используете более старую версию PHP.
Проверьте массив $_SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
не имеет ничего общего с заголовками HTTP. Это заполняется серверным программным обеспечением, все, что связано с HTTP в $_SERVER, имеет префикс HTTP_. php.net/manual/en/reserved.variables.server.php< /а>
- person poncha; 18.04.2019
Нравится:
$_SERVER['SERVER_ADDR'];