Как получить локальный IP-адрес сервера с помощью PHP?
Я разрабатываю PHP-приложение, которое будет работать только в локальной сети бизнеса. Приложение будет установлено на сервер с помощью пользовательского установщика, как вещь, которую мы сделали с помощью Stunnix Advanced Webserver.
в рамках создания приложения более удобным для пользователя я планирую отобразить ЛОКАЛЬНЫЙ IP сервера, так что это очень легко для других компьютеров в сети для доступа к приложению, просто введя этот IP в их адресная строка.
проблема в том, что я не могу получить ЛОКАЛЬНЫЙ IP сервера.
Я пробовал
сервер ( отображает только 127.0.0.1 )
REMOTE_ADDR (отображает внешний IP-адрес клиента )
SERVER_ADDR отображает правильный IP, но он делает это только в том случае, если я получаю доступ к нему от клиента, используя IP, который полностью разрушает его цель.
Я просто хочу, чтобы отобразить ЛОКАЛЬНЫЙ IP сервера при доступе непосредственно с сервера через .
Я несколько уверен, что это не возможно. Но если это так, пожалуйста, помогите.
редактировать
Я разрабатываю кросс-платформенное PHP-серверное приложение. Мы связываем Apache, PHP-установщики и базу данных SQlite как установщик с одним щелчком мыши вместе с нашим PHP-приложением, чтобы сделать его максимально удобным для пользователя. Любой может развернуть его на своем компьютере Windows, Mac или Linux. После установки, когда пользователь открывает приложение на сервере, он может видеть ip-адрес [локальный ip] и порт, который можно использовать для подключения к этому серверу. Приложение будет работать только в локальной сети а не по интернету.
Он должен показывать локальный IP-адрес так же, как приложение Android под названием Air Droid. Скриншот : https://lh3.ggpht.com/PmLopRm-Lj9WTnzm2MBI-bTbCLopAyqtd4C_4nvyDwLg8X0QwDbBbEREdWGHG5xku4s
7 ответов
проблема в том, что это не статическая информация. Любой компьютер может иметь несколько IP-адресов, связанных с несколькими сетевыми картами. Некоторые/все / ни один из них не может иметь веб-службы доступны на них. Возможно, нет ни одного ответа на вопрос, который вы задаете ОС.
если ваш сервер имеет простую конфигурацию с одним IP-адресом, вам, вероятно, лучше всего жестко закодировать это-это, безусловно, самый простой вариант. Если вы хотите определить его динамически, вот несколько бит информации, которые вы, надеюсь, найдете полезными:
-
$_SERVER['HTTP_HOST']
содержит адрес, который был введен в адресную строку браузера для доступа к странице. Если вы открываете страницу, набрав (например)http://192.168.0.1/index.php
в браузере$_SERVER['HTTP_HOST']
будет192.168.0.1
. - если вы использовали DNS-имя для доступа к странице,
gethostbyname($_SERVER['HTTP_HOST']);
превратит это DNS-имя в IP-адрес. -
$_SERVER['SERVER_NAME']
содержит имя, настроенное в конфигурации веб-сервера в качестве имени сервера. Если вы собираетесь использовать это, вы можете просто жестко закодировать его в PHP. -
$_SERVER['SERVER_ADDR']
будет содержать операционную систему основного IP-адреса сервера. Это может быть или не быть IP-адрес, который использовался для доступа к странице, и это может быть или не может быть IP-адрес с привязанным к нему веб-сервером. Это сильно зависит от конфигурации ОС и сервера. если сервер имеет один IP-адрес, это наверное безопасная ставка, хотя есть ситуации, когда это может содержать127.0.0.1
.
короче говоря, нет 100% надежного способа определить гарантированный рабочий IP-адрес веб-сервера, не изучая информацию, которая была отправлена на веб-сервер, чтобы сгенерировать страницу, которую вы создаете, которая, как вы говорите totally defeats its purpose
.
решения:
- hardcode в php (после установки нужно отредактировать это в ваших скриптах)
- настройте переменную в среде apache, чтобы к ней можно было получить доступ через php (после установки нужно добавить это в конфигурацию apache)
- анализировать
ifconfig -l
илиipconfig -a
вывод для определения IP-адресов сетевых интерфейсов компьютера исключите интерфейсы обратной связи. В лучшем случае вы получите один IP-адрес - и это будет ваш адрес нужно, добавив$_SERVER['SERVER_PORT']
. Если вы получите несколько IP-адресов - вы можете попробовать запросить их все, чтобы проверить, отвечают ли они на HTTP-запросы на$_SERVER['SERVER_PORT']
. Также вы можете поставить/ping.php
файл с каким-тоecho "my application";
чтобы определить ваш IP-адрес, если машина запускает несколько HTTP-серверов на разных IP-адресах.
Я также уверен, что это невозможно. Или, если это возможно, результаты не будут достоверными.
сервер может иметь несколько IP-адресов. Кроме того, IP-адрес, используемый для HTTP на сервере, может быть не тем, который используется для доступа к серверу из другого места (если есть обратный прокси или NAT). Переменная SERVER_ADDR показывает IP-адрес, который использовался для вызова PHP-скрипта; эта информация передается с веб-сервера, поэтому она не поможет для PHP-скрипта, который работает автономно (т. е. из раковины).
давайте посмотрим на это по-другому. Какую проблему вы пытаетесь решить? То есть, зачем вам нужен локальный IP-адрес сервера? Вместо того чтобы получать помощь в реализации решения, которое не будет работать, давайте рассмотрим исходную проблему и посмотрим, возможно ли другое решение.
Я должен указать, что в зависимости от вашей операционной системы могут быть способы получить список IPs, назначенных различным интерфейсам, путем анализа вывод команды оболочки, такой как ifconfig -a
или ip addr
. Но я не знаю вашей ОС, поэтому я не могу предложить, как это будет работать для вас.
$h = popen("ip addr | awk '/inet/{print}'");
$ip_list = array();
while ($ip_list[] = fread($h, 15)) { }
pclose($h);
вы можете добавить больше логики в PHP, чтобы избежать использования awk
в трубе, но вы получаете идею.
Если вы хотите получить адрес IP Lan как 192.168.x.x
вы можете использовать следующий код:
Я использую это и отлично выполняет мои требования. (тестируется только на компьютере с windows)
function getLocalIP(){
exec("ipconfig /all", $output);
foreach($output as $line){
if (preg_match("/(.*)IPv4 Address(.*)/", $line)){
$ip = $line;
$ip = str_replace("IPv4 Address. . . . . . . . . . . :","",$ip);
$ip = str_replace("(Preferred)","",$ip);
}
}
return $ip;
}
echo $ip = getLocalIP(); //This will return: 192.168.x.x (Your Local IP)
надеюсь, что это помогает. =)
попробуй :
<?php gethostbyname($_SERVER['SERVER_NAME']);
EDIT:
немного хаки, но, кажется, работает:
<?php
$str = file_get_contents("http://ip6.me/");
$pattern = "#\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b#";
preg_match($pattern, $str, $matches);
print_r($matches[0]);
но это зависит от третьего веб-сайта..
попробуйте использовать команду" ifconfig en1 inet".
print_r(exec("ifconfig en1 inet"));
выход:- inet 192.168.. маска сети вещания 0xffffff00 192.168.*.255