簡體   English   中英

如何使用PHP獲取服務器的本地IP地址?

[英]How do I get the local IP address of the server using PHP?

我正在開發一個 PHP 應用程序,它將僅在企業的 local.network 上運行。 該應用程序將使用自定義安裝程序安裝到服務器,就像我們使用 Stunnix Advanced Webserver 制作的一樣。

作為使應用程序更加用戶友好的一部分,我計划顯示服務器的本地 IP ,以便網絡中的其他計算機只需在其地址欄中鍵入此 IP 即可輕松訪問該應用程序。

問題是我無法獲取服務器的本地 IP

我努力了

SERVER_NAME (僅顯示 127.0.0.1)

REMOTE_ADDR (顯示客戶端外部 IP)

SERVER_ADDR顯示正確的 IP 但只有當我使用 IP 從客戶端訪問它時它才會這樣做,這完全違背了它的目的。

我只想在通過http://localhost本身直接從服務器訪問時顯示服務器的本地 IP

我有點確定這是不可能的。 但如果是,請幫助。

編輯

我正在開發跨平台 PHP 服務器應用程序之類的東西。 我們將 Apache,PHP 安裝程序和 SQlite 數據庫作為一鍵式安裝程序與我們的 PHP 應用程序捆綁在一起,以使其盡可能對用戶友好。 任何人都可以在運行Windows、Mac 或 Linux的計算機上部署它。 安裝后,當用戶在服務器上打開應用程序時,他可以看到ip 地址 [本地 ip]和可用於連接到此服務器的端口。 該應用程序將僅在 local.network 上運行,而不在 inte.net 上運行。

它應該顯示本地 IP,就像名為 Air Droid 的 Android 應用程序一樣。 截圖: https://lh3.ggpht.com/PmLopRm-Lj9WTnzm2MBI-bTbCLopAyqtd4C_4nvyDwLg8X0QwDbBbEREdWGHG5xku4s

你在這里遇到的問題是,這不是一個靜態的信息。 任何給定的計算機都可以有多個與多個網卡相關聯的IP地址。 部分/全部/全部可能都有可用的Web服務。 您詢問操作系統的問題可能沒有一個答案。

如果您的服務器具有簡單的單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']包含已在Web服務器配置中配置的名稱,作為其服務器名稱。 如果您打算使用它,您也可以在PHP中對其進行硬編碼。
  • $_SERVER['SERVER_ADDR']將包含服務器主IP地址的操作系統。 這可能是也可能不是用於訪問頁面的IP地址,它可能是也可能不是綁定了Web服務器的IP地址。 它在很大程度上取決於操作系統和服 如果服務器有一個IP地址,這可能是一個安全的賭注,盡管有些情況下這可能包含127.0.0.1

缺點是,沒有100%可靠的方法來確定Web服務器的保證工作IP地址,而不檢查發送到Web服務器的信息,以便生成您正在創建的頁面,如你說totally defeats its purpose

解決方案:

  1. php中的硬編碼(安裝時應該在腳本中編輯)
  2. 在apache環境中設置一個變量,以便可以通過php訪問(安裝時應該將其添加到apache的配置中)
  3. 解析ifconfig -lipconfig -a輸出以確定機器網絡接口的IP地址,排除環回接口。 在最好的情況下,您將收到一個IP地址 - 這將是您需要的地址,添加$_SERVER['SERVER_PORT'] 如果您將獲得多個IP地址 - 您可以嘗試查詢它們以檢查它們是否在$_SERVER['SERVER_PORT']上應答HTTP請求。 你也可以在/ping.php文件中加入某種echo "my application"; 如果計算機在不同的IP地址上運行多個HTTP服務器,則確定您的IP地址。

如果您想獲得Lan IP Adress Like 192.168.xx您可以使用以下代碼:

我正在使用它並完美地滿足我的要求。 (僅在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)

希望這可以幫助。 =)

我也很確定這是不可能的。 或者如果可能,結果將不可靠。

服務器可能有多個IP地址。 此外,服務器上用於HTTP的IP地址可能不是用於從其他地方到達服務器的IP地址(如果涉及反向代理或NAT)。 SERVER_ADDR變量顯示用於調用PHP腳本的IP地址; 此信息是從Web服務器傳遞的,因此對於獨立運行的PHP腳本(即從shell運行)無濟於事。

讓我們看看另一種方式。 你想解決什么問題? 也就是說,為什么需要服務器的本地IP? 我們不是尋求實施無法解決的解決方案的幫助,而是看看原始問題,看看是否有另一種可能的解決方案。

我應該指出,根據您的操作系統,可能有辦法通過解析shell命令的輸出來獲取分配給各種接口的IP列表,如ifconfig -aip addr 但是我不知道你的操作系統,所以我不能建議這對你有用。

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

您可以在PHP中添加更多邏輯以避免在管道中使用awk ,但是您可以理解。

嘗試使用“ifconfig en1 inet”命令。

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

輸出: - inet 192.168。 網絡掩碼0xffffff00廣播192.168。*。255

試試:

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

編輯:

有點hacky,但似乎工作:

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

但這依賴於第三個網站..

您可以使用以下命令查看所有可用信息:

print_r($_SERVER, 1);

funciona bien en windows 10, sin embargo en windows 11 es diferente debi usar un metodo for para mejorar el codigo y hacerlo mas sencillo de echo le hare algunos ajustes

$saldo_de_linea = '<br>';
$ipconfig =  ( shell_exec ("ipconfig/all"));
echo $saldo_de_linea;
$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));
$d1 = explode(':',$d[1]);
echo 'SEGMENTO_A 10: ' . $d1[10];
echo $saldo_de_linea;
echo 'your localhost ip use for xampp is ';
echo $saldo_de_linea;
echo $d1[10];
$mystring = $d1[10];
$findme   = '(';
$pos = strpos($mystring, $findme);
if ($pos === false) {
    echo "La cadena '$findme' no fue encontrada en la cadena '$mystring'";
} else {
    echo "La cadena '$findme' fue encontrada en la cadena '$mystring'";
    echo " y existe en la posición $pos";
}
echo $saldo_de_linea;
$ip_localhost_use_for_xampp = substr($mystring, 0, $pos);
echo $ip_localhost_use_for_xampp; // imprime "nas"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM