![](/img/trans.png)
[英]How can i get IP address of systems in a local network which accessing the webpage from local server using php
[英]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
。 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
。
解決方案:
ifconfig -l
或ipconfig -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 -a
或ip 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.