我正在开发一个只在企业的本地网络上运行的PHP应用程序。应用程序将使用自定义安装程序安装到服务器,就像我们使用Stunnix Advanced Webserver制作的那样。
作为使应用程序更加用户友好的一部分,我计划显示服务器的 LOCAL IP ,以便网络中的其他计算机只需键入即可轻松访问应用程序这个IP在他们的地址栏中。
问题是我无法获得服务器的 LOCAL IP 。
我试过了
SERVER_NAME (仅显示127.0.0.1)
REMOTE_ADDR (显示客户端外部IP)
SERVER_ADDR 显示正确的IP,但只有当我使用完全违背其目的的IP从客户端访问它时才会这样做。
我只想在通过http://localhost
本身直接从服务器访问时显示服务器的 LOCAL IP 。
我确信这是不可能的。但如果是,请帮助。
修改
我正在开发一个跨平台的PHP服务器应用程序。我们将Apache,PHP安装程序和SQlite数据库作为一键安装程序与我们的PHP应用程序捆绑在一起,以使其尽可能方便用户使用。任何人都可以在运行 Windows,Mac或Linux 的计算机上进行部署。在用户在服务器上打开应用程序安装后,他可以看到 ip address [local ip] 和可用于连接此服务器的端口。该应用程序只能在本地网络上运行,而不能在互联网上运行。
它应该显示本地IP,就像名为Air Droid的Android应用程序一样。 屏幕截图:https://lh3.ggpht.com/PmLopRm-Lj9WTnzm2MBI-bTbCLopAyqtd4C_4nvyDwLg8X0QwDbBbEREdWGHG5xku4s
答案 0 :(得分:12)
您在这里遇到的问题是,这不是一条静态的信息。任何给定的计算机都可以有多个与多个网卡相关联的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
。
答案 1 :(得分:3)
解决方案:
ifconfig -l
或ipconfig -a
输出以确定机器网络接口的IP地址,排除环回接口。在最好的情况下,您将收到一个IP地址 - 这将是您需要的地址,添加$_SERVER['SERVER_PORT']
。如果您将获得多个IP地址 - 您可以尝试查询它们以检查它们是否在$_SERVER['SERVER_PORT']
上回复了HTTP请求。如果机器在不同的IP地址上运行多个HTTP服务器,您也可以使用某种/ping.php
放置echo "my application";
文件来确定您的IP地址。答案 2 :(得分:2)
我也很确定这是不可能的。或者如果可能,结果将不可靠。
服务器可能有多个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
,但您明白了。
答案 3 :(得分:2)
如果您想获得 Lan IP地址赞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)
希望这会有所帮助。 =)
答案 4 :(得分:0)
尝试:
<?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]);
但这依赖于第三个网站..
答案 5 :(得分:0)
您可以使用以下命令查看所有可用信息:
print_r($_SERVER, 1);
答案 6 :(得分:0)
尝试使用“ifconfig en1 inet”命令。
print_r(exec("ifconfig en1 inet"));
输出: - inet 192.168。。 netmask 0xffffff00 broadcast 192.168。*。255