如何使用PHP获取服务器的本地IP地址?

时间:2012-03-28 10:30:13

标签: php apache

我正在开发一个只在企业的本地网络上运行的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

7 个答案:

答案 0 :(得分:12)

您在这里遇到的问题是,这不是一条静态的信息。任何给定的计算机都可以有多个与多个网卡相关联的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 :(得分:3)

解决方案:

  1. php中的硬编码(安装时应该在脚本中编辑)
  2. 在apache环境中设置变量,以便可以通过php访问(安装时应该将其添加到apache的配置中)
  3. 解析ifconfig -lipconfig -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 -aip 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