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

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

15 ответов


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

$_SERVER['SERVER_ADDR'];

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

$_SERVER['SERVER_PORT'];

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

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

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


например:

$_SERVER['SERVER_ADDR']

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

$_SERVER['LOCAL_ADDR']

ни один из самых проголосовавших ответов не будет надежно возвращать публичный адрес сервера. Вообще $_SERVER['SERVER_ADDR'] будет правильным, но если вы обращаетесь к серверу через VPN, он, скорее всего, вернет внутренний сетевой адрес, а не публичный адрес, и даже если не в той же сети, некоторые конфигурации будут просто пустыми или иметь какое-то другое указанное значение.

аналогично, есть сценарии, где $host= gethostname(); $ip = gethostbyname($host); не будет возвращать правильные значения, потому что он полагается на для экстраполяции IP-адреса сервера на DNS (внутренние или внешние записи) и параметры имени хоста сервера. Оба эти шага потенциально ошибочны. Например, если имя хоста сервера отформатировано как доменное имя (т. е. HOSTNAME=yahoo.com) тогда (по крайней мере, на моем php5.4 / Centos6 setup)gethostbyname пропустит прямо к поиску Yahoo.com адрес, а не локального сервера.

кроме того, потому что gethostbyname падает обратно на общедоступные записи DNS тестирование сервер с неопубликованными или неверными публичными записями DNS (например, вы обращаетесь к серверу по localhost или IP-адрес, или если вы переопределяете общедоступный DNS, используя локальный hosts file), то вы получите либо нет IP-адреса (он просто вернет имя хоста), либо, что еще хуже, он вернет неправильный адрес, указанный в общедоступных записях DNS, если он существует или если есть подстановочный знак для домена.

в зависимости от ситуации, вы также можете попробовать третий подход делаю что-то вроде этого:--10-->

$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']; }

$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";

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


Я нашел, что это работает для меня: GetHostByName ("");

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


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

echo $_SERVER['SERVER_ADDR'];

такой:

$_SERVER['SERVER_ADDR'];