如何获取使用PHP的服务器的本地IP地址?
我正在开发一个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
的问题。任何给定的计算机都可以有多个与多个网卡关联的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
。
尝试:
<?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]);
但这种依靠第三个网站。 。
你可以在命令行看看所有可用的信息:你在这里的是,这不是一个静态的资料片
print_r($_SERVER, 1);
我也很确定这是不可能的。或者如果可能的话,结果将不可靠。
服务器可能有多个IP地址。此外,服务器上用于HTTP的IP地址可能不是用于从别处到达服务器的IP地址(如果涉及反向代理或NAT)。 SERVER_ADDR变量显示用于调用PHP脚本的IP地址;这些信息是从Web服务器传递来的,所以它不会帮助独立运行的PHP脚本(即从shell运行)。
让我们来看另一种方式。你想解决什么问题?也就是说,你为什么需要服务器的本地IP?让我们看看最初的问题,看看是否有其他可行的解决方案,而不是获得帮助来实现无效的解决方案。
我应该指出的是,根据您的操作系统上,有很多方法可以得到通过解析一个shell命令的输出像ifconfig -a
或ip addr
分配给不同的接口的IP地址列表。但我不知道你的操作系统,所以我不能建议这对你有什么用。
$h = popen("ip addr | awk '/inet/{print$2}'");
$ip_list = array();
while ($ip_list[] = fread($h, 15)) { }
pclose($h);
你可以把更多的逻辑到PHP,以避免在管道使用awk
,但你的想法。
我我正在开发一个跨平台PHP服务器应用程序的东西。我们将Apache,PHP安装程序和SQlite数据库作为一键安装程序与我们的PHP应用程序捆绑在一起,以尽可能方便用户使用。任何人都可以在他们的电脑上部署它 – ajaybc 2012-03-28 11:05:35
好吧,如果您甚至不知道操作系统的用户将运行您的应用程序,或者安全模式是否打开,那么shell工具将无助于此。正如我所说,如果您可以描述您尝试解决的问题而不是您提出的解决方案,那么我们可以帮助解决该问题,而不是帮助实施解决方案。 – ghoti 2012-03-28 11:07:39
请在问题中查看我的编辑。谢谢 – ajaybc 2012-03-28 11:12:46
解决方案:
硬编码在PHP- (在安装时应该在脚本编辑这个)
- 设置Apache中的环境变量,这样可以通过PHP(在安装时应该加上这个被访问apache的配置)
- 解析
ifconfig -l
或ipconfig -a
输出确定机器的网络接口的IP地址,排除回环接口。在最好的情况下,你会收到一个IP地址 - 这将是你需要的地址,加入$_SERVER['SERVER_PORT']
。如果您将获得多个IP地址 - 您可以尝试全部查询它们以检查它们是否回答$_SERVER['SERVER_PORT']
上的HTTP请求。如果机器在不同IP地址上运行多个HTTP服务器,您也可以将/ping.php
文件与某种echo "my application";
相关联,以确定您的IP地址。
请参阅我编辑的问题 – ajaybc 2012-03-28 11:13:10
好吧,我会用第三部分。但是PHP应该能够执行'exec()'并使用不同的解析算法,具体取决于操作系统 - windows的ipconfig -a,unix的ifconfig -l等等。 – 2012-03-28 11:26:42
如果你想获得兰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)
希望这有助于。 =)
ipconfig是仅Windows。不是很有用。 – kodeart 2014-04-12 01:57:59
尝试使用“ifconfig en1 inet”命令。
print_r(exec("ifconfig en1 inet"));
输出: - INET 192.168。 。 netmask 0xffffff00 broadcast 192.168。*。255
ifconfig不适用于Windows – 2015-10-20 14:26:30
感谢您的建议。这真的很有道理。如果服务器连接到2个网络(例如连接到以太网和WiFi的笔记本电脑),我同意选择正确的网络和IP将非常不可靠。我没有这样想过。 顺便说一句,让用户自己找到他的IP地址,使得应用程序不太适合n00b。 :( – ajaybc 2012-03-28 10:58:06
@ajaybc这就是DNS的用途......如果它都是本地的,你可以使用机器名称访问网络,如果它通过互联网,在你的IP上指向一个域/子域的A记录;-) – DaveRandom 2012-03-28 11:05:13