Відповіді:
Як це для ip сервера:
$_SERVER['SERVER_ADDR'];
і це для порту
$_SERVER['SERVER_PORT'];
John K
натомість відповідь
Якщо ви використовуєте PHP версії 5.3 або новішої, ви можете зробити наступне:
$host= gethostname();
$ip = gethostbyname($host);
Це добре працює, якщо ви використовуєте автономний скрипт, а не працюєте через веб-сервер.
/etc/hosts
файлі і буде швидко, хоча це може бути просто так 127.0.0.1
. Якщо все-таки доведеться викликати DNS, це буде повільно, як ви говорите.
наприклад:
$_SERVER['SERVER_ADDR']
коли ви на IIS, спробуйте:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
доступний лише під IIS, коли PHP працює як модуль CGI.
Я зайшов на цю сторінку, шукаючи спосіб отримати власну 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\.'
Жоден з найбільш голосованих відповідей надійно не поверне публічну адресу сервера. Як правило, $_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
вони можуть бути повільними. Я, чесно кажучи, не впевнений, який підхід буде правильним найчастіше, але урок, який слід сприйняти, полягає в тому, що конкретні сценарії / конфігурації призведуть до неправильних результатів для всіх цих підходів ... тому, якщо можливо, перевірте, що підхід ви є використання повертає очікувані значення.
Це те, що ви можете використовувати як адаптацію вищезазначених прикладів, не турбуючись про завиток, встановлений на вашому сервері.
<?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);
?>
Якщо ви використовуєте PHP в bash shell, ви можете використовувати:
$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']; }
Перевірте масив $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
не має нічого спільного з заголовками HTTP. Це заповнено серверним програмним забезпеченням, усі речі, пов’язані з HTTP, у $ _SERVER з префіксом HTTP_. php.net/manual/en/reserved.variables.server.php
Подобається це:
$_SERVER['SERVER_ADDR'];