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

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


person pooja    schedule 27.04.2011    source источник
comment
Вы имеете в виду IP-адрес запроса или IP-адрес машины, на которой запущено ваше приложение?   -  person wosis    schedule 27.04.2011


Ответы (14)


Например, для IP-адреса сервера:

$_SERVER['SERVER_ADDR'];

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

$_SERVER['SERVER_PORT'];
person CloudyMarble    schedule 27.04.2011
comment
Нет. На некоторых общих хостах это возвращает ::1 - person TheRealChx101; 02.08.2014
comment
Это может быть неверно в зависимости от балансировщика нагрузки, используемого перед вашим веб-сервером. Вам также нужен заголовок X-Forwarded-For в этом сценарии: en.wikipedia.org /wiki/X-Forwarded-For - person Ligemer; 26.08.2014
comment
Это НЕ адрес сервера! Это адрес, по которому удаленный браузер обращается к серверу, находящемуся под контролем удаленного пользователя. Вместо этого используйте ответ от John K - person Ariel; 12.02.2015
comment
Это не дает ip сервера. Почему-то выдает мой локальный ip - person Thomas Williams; 28.06.2017
comment
Он также не дает адрес сервера php-fpm, но предназначен для связанного веб-сервера (nginx, apache). Таким образом, это будет неправильно для спецификации хоста mysql-client (user@host). - person scipilot; 25.04.2018
comment
Это также не работает, если вы вызываете его через CLI. Как предложил John K, лучше использовать gethostbyname(gethostname()); - person David; 19.03.2019
comment
@ TheRealChx101 уже указал на проблему с предложенным вами решением. Поскольку это принятое решение, вы должны либо добавить @JohnK решение с соответствующей ссылкой, либо хотя бы дать ссылку на существующее решение. Ваше здоровье! - person Fr0zenFyr; 05.07.2019

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

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

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

person John K    schedule 11.06.2013
comment
Идеально, то, что я ищу. Спасибо Джон - person Frank; 07.01.2014
comment
+1 Это единственное решение, которое будет работать с командной строкой. - person Adam Elsodaney; 09.11.2014
comment
@andreas Не должно. Локальное имя хоста должно быть в файле /etc/hosts и будет быстрым, хотя может быть просто 127.0.0.1. Если ему действительно нужно вызывать DNS, то он будет медленным, как вы говорите. - person Ariel; 12.02.2015
comment
+1, но просто вопрос .. я пробую это с xampp на локальном сервере, и он возвращает ip 192.168 и т. д., но .. это должно быть 127.0.0.1 нет ?? - person Andrea Bori; 29.10.2015
comment
это работает для меня, но на некоторых машинах отображается доменное имя. как исправить эту проблему. - person Dharani Dharan; 17.12.2015
comment
Это дает мне 127.0.0.1. Как получить публичный IP? Например, stackoverflow.com = 151.101.193.69. - person Drewdavid; 19.05.2021

Например:

$_SERVER['SERVER_ADDR']

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

$_SERVER['LOCAL_ADDR']
person Flask    schedule 27.04.2011
comment
$_SERVER['LOCAL_ADDR'] доступен только в IIS, когда PHP работает как модуль CGI. - person Rudi Visser; 27.04.2011
comment
@rudi_visser это работает и с fastcgi, но если вы подключаетесь через локахост, вместо этого вы получаете :: 1 обратно. Если вы подключаетесь через имя или IP-адрес сервера, вы получаете реальный IP-адрес. - person starbeamrainbowlabs; 21.07.2012
comment
@starbeamrainbowlabs FastCGI является CGI :) Я имел в виду, в отличие от работы в качестве модуля ISAPI, это было написано до появления FastCGI в качестве стабильной платформы. - person Rudi Visser; 21.07.2012
comment
@starbeamrainbowlabs все, что выглядит как ::1, вероятно, является IP6-адресом. - person Toby Allen; 21.12.2012
comment
@TobyAllen Спасибо :). Странно то, что моя сеть не поддерживает ipv6, но мой сервер (компьютер с Windows 7) сообщает свой IP-адрес как ::1, петлевой адрес ipv6. - person starbeamrainbowlabs; 21.12.2012

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

person Dom    schedule 22.07.2016
comment
Это единственный вариант, который действительно работает при запуске PHP-скриптов из оболочки. Вопрос: когда есть несколько активных интерфейсов, как это решает, какой адрес вернуть? Я тестировал с активными проводными и беспроводными подключениями Ethernet, а затем только с активными беспроводными сетями, и оба раза он возвращает IP-адрес wlan. Хороший сценарий, спасибо! - person Ryan Griggs; 20.05.2017
comment
На самом деле он не знает, какой из них вернуть. Он просто возвращает последний интерфейс inet из вывода ifconfig, но игнорирует 127.0.0.1. Если у вас есть только обычные интерфейсы, то он неплохо справляется со своей задачей. Возможно, будет безопаснее, если вы укажете нужный интерфейс ifconfig wlan0 | .... Этот скрипт отнюдь не идеален, но он работает в простых настройках и демонстрирует, как это сделать в принципе, чтобы настроить его по мере необходимости. - person Dom; 24.05.2017
comment
ифконфиг | grep 'инет адрес' | вырезать -d ':' -f 2 | awk '{напечатать $1}' | grep -vE '^(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|127\. )' - это моя последняя версия этого. Он отфильтровывает все локальные IP-адреса и дает вам только внешние - person Dom; 14.11.2017
comment
У меня несколько сетевых интерфейсов, поэтому я сделал 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 возвращает ожидаемые значения.

person Ben D    schedule 19.04.2015

Это то, что вы можете использовать в качестве адаптации приведенных выше примеров, не беспокоясь о том, что 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);
    ?>
person Emmanuel Mahuni    schedule 18.11.2017

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

echo $_SERVER['SERVER_ADDR'];
person Ale    schedule 27.04.2011

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

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
person qbert220    schedule 27.04.2011
comment
Действительно работает! С $_SERVER[SERVER_ADDR] я получил 127.0.0.1 - person Arthur Veselov; 13.10.2020

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

$server_name=exec('hostname');

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

person Stefano Zanola    schedule 23.10.2014

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

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

person Sanford Staab    schedule 20.12.2012

Я только что создал простой скрипт, который возвращает $_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']; }
person Xander    schedule 10.04.2013

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

person OpenCode    schedule 27.04.2011

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

echo $_SERVER['SERVER_ADDR'];
person Gaurang    schedule 03.04.2013
comment
Он не находит настоящий IP-адрес, он находит произвольные, непроверенные HTTP-заголовки, которые любой может установить и использовать для подмены своего IP-адреса, если вы предпочитаете их. Если клиент за прокси, так тому и быть, не доверяйте никаким заголовкам HTTP. Это тоже совершенно не подходит к вопросу. - person deceze♦; 03.04.2013
comment
Не могу понять, как этот ответ вообще не соответствует вопросу. Вопрос был: как я могу определить IP-адрес сервера в PHP?. Либо ОП должен научиться лучше спрашивать, либо вы должны научиться читать вопрос. Кроме того, если клиент находится за прокси-сервером, вы все равно облажаетесь, независимо от того, что вы пытаетесь сделать со стороны сервера. Совершенно другой сценарий, когда сервер находится за прокси, так как вы можете проверить с помощью заголовков X-FORWARDED-FOR. - person Luis Masuelli; 20.05.2014
comment
@deceze $_SERVER["SERVER_ADDR"] не имеет ничего общего с заголовками HTTP. Это заполняется серверным программным обеспечением, все, что связано с HTTP в $_SERVER, имеет префикс HTTP_. php.net/manual/en/reserved.variables.server.php< /а> - person poncha; 18.04.2019

Нравится:

$_SERVER['SERVER_ADDR'];
person Shadow Wizard Wearing Mask V2    schedule 27.04.2011