Как определить IP-адрес сервера в PHP - PullRequest
107 голосов
/ 27 апреля 2011

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

Ответы [ 15 ]

166 голосов
/ 27 апреля 2011

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

$_SERVER['SERVER_ADDR'];

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

$_SERVER['SERVER_PORT'];
91 голосов
/ 12 июня 2013

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

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

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

19 голосов
/ 27 апреля 2011

например:

$_SERVER['SERVER_ADDR']

когда вы на IIS, попробуйте:

$_SERVER['LOCAL_ADDR']
11 голосов
/ 22 июля 2016

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

10 голосов
/ 19 апреля 2015

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

9 голосов
/ 18 ноября 2017

Это то, что вы можете использовать в качестве адаптации приведенных выше примеров, не беспокоясь о 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);
    ?>
5 голосов
/ 23 октября 2014

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

$server_name=exec('hostname');

Поскольку $_SERVER[] SERVER_ADDR, HTTP_HOST и SERVER_NAME не установлены.

5 голосов
/ 27 апреля 2011

Проверьте $ _ СЕРВЕР массив

echo $_SERVER['SERVER_ADDR'];
4 голосов
/ 27 апреля 2011

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

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
2 голосов
/ 10 апреля 2013

Я только что создал простой скрипт, который будет возвращать в IIS $ _SERVER ['REMOTE_ADDR'] и $ _SERVER ['SERVER_ADDR'], чтобы вам не приходилось менять каждую переменную.Просто вставьте этот текст в ваш php-файл, который включен в каждую страницу.

/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
...