Как определить IP-адрес сервера в PHP


Как я могу определить IP-адрес сервера в PHP?

 90
Author: parsaya, 2011-04-27

15 answers

Вот так для ip-адреса сервера:

$_SERVER['SERVER_ADDR'];

И это для порта

$_SERVER['SERVER_PORT'];
 152
Author: CloudyMarble, 2016-09-14 13:04:23

Если вы используете PHP версии 5.3 или выше, вы можете сделать следующее:

$host= gethostname();
$ip = gethostbyname($host);

Это хорошо работает, когда вы запускаете автономный скрипт, а не через веб-сервер.

 73
Author: John K, 2013-06-11 20:50:52

Например:

$_SERVER['SERVER_ADDR']

Когда вы находитесь в IIS, попробуйте:

$_SERVER['LOCAL_ADDR']
 19
Author: Flask, 2011-04-27 07:46:52

Ни один из ответов с наибольшим количеством голосов не будет надежно возвращать публичный адрес сервера. Как правило, $_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, это может быть медленным. Честно говоря, я не уверен, какой подход будет правильным чаще всего, но урок, который следует принять близко к сердцу, заключается в том, что конкретные сценарии/конфигурации приведут к неправильным выводам для всех этих подходов... поэтому, если возможно, убедитесь, что используемый вами подход возвращает значения, которые вы ожидаете.

 11
Author: Ben D, 2015-04-19 17:06:23

Я пришел на эту страницу в поисках способа получить свой собственный 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?)

 8
Author: Dom, 2017-05-23 12:34:50

Проверьте массив $_SERVER

echo $_SERVER['SERVER_ADDR'];
 6
Author: Ale, 2011-04-27 07:47:41

Если вы используете PHP в оболочке bash, вы можете использовать:

$server_name=exec('hostname');

Потому что $_SERVER[] SERVER_ADDR, HTTP_HOST и SERVER_NAME не заданы.

 5
Author: Stefano Zanola, 2014-10-23 08:51:06

Все предыдущие ответы дают $_SERVER['SERVER_ADDR']. Это не будет работать на некоторых установках IIS. Если вы хотите, чтобы это работало в IIS, используйте следующее:

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
 4
Author: qbert220, 2011-04-27 07:54:32

Это то, что вы могли бы использовать в качестве адаптации приведенных выше примеров, не беспокоясь о 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);
    ?>
 4
Author: Emmanuel Mahuni, 2017-11-18 09:58:41

Я только что создал простой скрипт, который вернет $_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']; }
 2
Author: Xander, 2013-04-10 15:31:40
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";
 1
Author: Axe, 2011-04-27 07:48:43

Возможно, вам придется использовать $HTTP_SERVER_VARS['server_ADDR'], если вы ничего не получаете из вышеприведенных ответов и если вы используете более старую версию PHP

 1
Author: OpenCode, 2011-04-27 08:05:50

Я обнаружил, что это работает на меня: Имя хоста("");

Запуск XAMPP v1.7.1 в Windows 7 под управлением веб-сервера Apache. К сожалению, он просто дает мой IP-адрес шлюза.

 1
Author: Sanford Staab, 2012-12-20 21:20:15

Проверьте массив $_SERVER

echo $_SERVER['SERVER_ADDR'];
 -1
Author: Gaurang, 2013-04-03 11:26:13

Вот так:

$_SERVER['SERVER_ADDR'];
 -2
Author: Shadow Wizard, 2011-04-27 07:47:58