Как получить локальный 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.


решения:

  1. hardcode в php (после установки нужно отредактировать это в ваших скриптах)
  2. настройте переменную в среде apache, чтобы к ней можно было получить доступ через php (после установки нужно добавить это в конфигурацию apache)
  3. анализировать 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)

надеюсь, что это помогает. =)


вы можете просмотреть всю доступную информацию с помощью команды:

print_r($_SERVER, 1);

попробуй :

<?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