Как я могу получить локальный IP-адрес сервера, используя PHP? - PullRequest
9 голосов
/ 28 марта 2012

Я занимаюсь разработкой приложения PHP, которое будет работать только в локальной сети предприятия.Приложение будет установлено на сервер с помощью специального установщика, аналогичного тому, который мы сделали с помощью Stunnix Advanced Webserver.

В рамках повышения удобства использования приложения я планирую отобразить ЛОКАЛЬНЫЙ IP сервера, так что другим компьютерам в сети очень легко получить доступ к приложению, просто набрав этот IP-адрес в их адресной строке.

Проблема в том, что я не могу получить ЛОКАЛЬНЫЙ IP сервера.

Я пытался

SERVER_NAME (отображается только 127.0.0.1)

REMOTE_ADDR (отображается клиентвнешний IP-адрес)

SERVER_ADDR отображает правильный IP-адрес, но это происходит только в том случае, если я получаю к нему доступ от клиента с использованием IP-адреса, который полностью нарушает его назначение.

Я просто хочу отобразить ЛОКАЛЬНЫЙ IP сервера при доступе непосредственно с сервера через сам http://localhost.

Я несколько уверен, что это не таквозможный.Но если это так, пожалуйста, помогите.

РЕДАКТИРОВАТЬ

Я занимаюсь разработкой кроссплатформенного приложения на PHP-сервере.Мы связываем установщики Apache, PHP и базу данных SQlite как установщик одним щелчком вместе с нашим приложением PHP, чтобы сделать его максимально удобным для пользователя.Любой может развернуть его на своем компьютере под управлением Windows, Mac или Linux .После установки, когда пользователь открывает приложение на сервере, он может видеть IP-адрес [local ip] и порт, который можно использовать для подключения к этому серверу.Приложение будет работать только в локальной сети, а не в Интернете.

Оно должно отображать локальный IP-адрес, как и приложение для Android под названием Air Droid.Снимок экрана: https://lh3.ggpht.com/PmLopRm-Lj9WTnzm2MBI-bTbCLopAyqtd4C_4nvyDwLg8X0QwDbBbEREdWGHG5xku4s

Ответы [ 7 ]

12 голосов
/ 28 марта 2012

Проблема, с которой вы столкнулись, заключается в том, что это не статичная информация. Любой данный компьютер может иметь несколько 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.

3 голосов
/ 28 марта 2012

Решения:

  1. жесткий код в php (после установки необходимо отредактировать это в ваших скриптах)
  2. установить переменную в среде apache, чтобы к ней можно было получить доступ через php (после установкинеобходимо добавить это в конфигурацию apache)
  3. parse ifconfig -l или ipconfig -a output, чтобы определить IP-адреса сетевых интерфейсов машины, исключая петлевые интерфейсы.В лучшем случае вы получите один IP-адрес - и это будет тот адрес, который вам нужен, добавив $_SERVER['SERVER_PORT'].Если вы получите несколько IP-адресов - вы можете попробовать запросить их все, чтобы проверить, отвечают ли они HTTP-запросам на $_SERVER['SERVER_PORT'].Также вы можете поместить файл /ping.php с некоторым типом echo "my application";, чтобы определить ваш IP-адрес, если на компьютере запущено несколько HTTP-серверов с разными IP-адресами.
2 голосов
/ 17 июня 2013

Если вы хотите получить LAN IP-адрес Как 192.168.x.x Вы можете использовать следующий код:

Я использую это и полностью выполняю мои требования.(проверено только в Windows Machine)

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)

Надеюсь, это поможет.=)

2 голосов
/ 28 марта 2012

Я также уверен, что это невозможно.Или, если это возможно, результаты не будут надежными.

Сервер может иметь несколько IP-адресов.Кроме того, IP-адрес, используемый для HTTP на сервере, может не совпадать с тем, который используется для доступа к серверу из другого места (если задействован обратный прокси-сервер или NAT).Переменная SERVER_ADDR показывает IP-адрес, который использовался для вызова скрипта PHP;эта информация передается с веб-сервера, поэтому она не поможет скрипту PHP, работающему автономно (т.е. из оболочки).

Давайте посмотрим на это по-другому.Какую проблему ты пытаешься решить?То есть зачем вам локальный IP сервера?Вместо того, чтобы получить помощь в реализации решения, которое не будет работать, давайте посмотрим на исходную проблему и посмотрим, возможно ли другое решение.

Я должен указать, что в зависимости от вашей операционной системы могут быть способычтобы получить список IP-адресов, назначенных различным интерфейсам, анализируя выходные данные команды оболочки, например ifconfig -a или ip addr.Но я не знаю вашу ОС, поэтому не могу предположить, как это будет работать для вас.

$h = popen("ip addr | awk '/inet/{print$2}'");
$ip_list = array();
while ($ip_list[] = fread($h, 15)) { }
pclose($h);

Вы можете добавить больше логики в PHP, чтобы избежать использования awk в конвейере, ноВы поняли.

0 голосов
/ 23 июня 2014

Попробуйте использовать команду "ifconfig en1 inet".

print_r(exec("ifconfig en1 inet"));

Выход: - инет 192.168. . сетевая маска 0xffffff00, широковещательная 192.168. *. 255

0 голосов
/ 28 марта 2012

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

print_r($_SERVER, 1);
0 голосов
/ 28 марта 2012

Попробуйте:

<?php gethostbyname($_SERVER['SERVER_NAME']);

РЕДАКТИРОВАТЬ:

Немного хакерский, но, похоже, работает:

<?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]);

Но это зависит от третьего сайта ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...