2012-03-28 181 views
9

我正在开发一个PHP应用程序,它只能在本地的企业网络上运行。应用程序将使用自定义安装程序安装到服务器,就像我们使用Stunnix高级Web服务器所做的一样。如何获取使用PHP的服务器的本地IP地址?

随着使得应用更加人性化,我打算以显示服务器的本地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,就像名为Air Droid的Android应用程序一样。 截图:https://lh3.ggpht.com/PmLopRm-Lj9WTnzm2MBI-bTbCLopAyqtd4C_4nvyDwLg8X0QwDbBbEREdWGHG5xku4s

回答

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

+0

感谢您的建议。这真的很有道理。如果服务器连接到2个网络(例如连接到以太网和WiFi的笔记本电脑),我同意选择正确的网络和IP将非常不可靠。我没有这样想过。 顺便说一句,让用户自己找到他的IP地址,使得应用程序不太适合n00b。 :( – ajaybc 2012-03-28 10:58:06

+1

@ajaybc这就是DNS的用途......如果它都是本地的,你可以使用机器名称访问网络,如果它通过互联网,在你的IP上指向一个域/子域的A记录;-) – DaveRandom 2012-03-28 11:05:13

0

尝试:

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

但这种依靠第三个网站。 。

+0

对不起,这不起作用。因为它显示** 127.0.0.1 **。我想要的是一个IP,如** 192.168.1.6 **,这是服务器的本地IP – ajaybc 2012-03-28 10:40:32

+0

也试过了你的编辑。但它只是获得服务器的**外部ip **。我需要的是服务器的**本地ip **。谢谢 – ajaybc 2012-03-28 10:54:33

0

你可以在命令行看看所有可用的信息:你在这里的是,这不是一个静态的资料片

print_r($_SERVER, 1); 
2

我也很确定这是不可能的。或者如果可能的话,结果将不可靠。

服务器可能有多个IP地址。此外,服务器上用于HTTP的IP地址可能不是用于从别处到达服务器的IP地址(如果涉及反向代理或NAT)。 SERVER_ADDR变量显示用于调用PHP脚本的IP地址;这些信息是从Web服务器传递来的,所以它不会帮助独立运行的PHP脚本(即从shell运行)。

让我们来看另一种方式。你想解决什么问题?也就是说,你为什么需要服务器的本地IP?让我们看看最初的问题,看看是否有其他可行的解决方案,而不是获得帮助来实现无效的解决方案。

我应该指出的是,根据您的操作系统上,有很多方法可以得到通过解析一个shell命令的输出像ifconfig -aip addr分配给不同的接口的IP地址列表。但我不知道你的操作系统,所以我不能建议这对你有什么用。

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

你可以把更多的逻辑到PHP,以避免在管道使用awk,但你的想法。

+0

我我正在开发一个跨平台PHP服务器应用程序的东西。我们将Apache,PHP安装程序和SQlite数据库作为一键安装程序与我们的PHP应用程序捆绑在一起,以尽可能方便用户使用。任何人都可以在他们的电脑上部署它 – ajaybc 2012-03-28 11:05:35

+0

好吧,如果您甚至不知道操作系统的用户将运行您的应用程序,或者安全模式是否打开,那么shell工具将无助于此。正如我所说,如果您可以描述您尝试解决的问题而不是您提出的解决方案,那么我们可以帮助解决该问题,而不是帮助实施解决方案。 – ghoti 2012-03-28 11:07:39

+0

请在问题中查看我的编辑。谢谢 – ajaybc 2012-03-28 11:12:46

3

解决方案:

硬编码在PHP
  1. (在安装时应该在脚本编辑这个)
  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地址。
+0

请参阅我编辑的问题 – ajaybc 2012-03-28 11:13:10

+0

好吧,我会用第三部分。但是PHP应该能够执行'exec()'并使用不同的解析算法,具体取决于操作系统 - windows的ipconfig -a,unix的ifconfig -l等等。 – 2012-03-28 11:26:42

2

如果你想获得兰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) 

希望这有助于。 =)

+2

ipconfig是仅Windows。不是很有用。 – kodeart 2014-04-12 01:57:59

0

尝试使用“ifconfig en1 inet”命令。

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

输出: - INET 192.168。 netmask 0xffffff00 broadcast 192.168。*。255

+0

ifconfig不适用于Windows – 2015-10-20 14:26:30