【问题标题】:Simply find the ip address of server只需找到服务器的IP地址
【发布时间】:2012-02-01 12:40:14
【问题描述】:

以下用于查找主机服务器的实际本地 IP 地址(例如192.168.1.X)的代码在开发机器上运行良好

$ip = getHostByName( getHostName() );

将它转移到另一个服务器它开始输出127.0.0.1

getHostName() 似乎返回 localhost,而后者又被 getHostByName() 转换为 127.0.0.1

在这里查看其他问题,$_SERVER['SERVER_ADDR'] 似乎可以解决这个难题,但这也返回了127.0.0.1

检查和搜索来自phpinfo() 的输出不会返回机器实际IP 地址的任何线索。

说真的,有人知道获取运行脚本的机器的 IP 地址的防弹(越简单越好)方法吗?为什么不做后空翻就很难得到这样的基础数据?

我真的不想在配置文件中硬编码 IP 地址...

【问题讨论】:

  • 您的服务器是否在同一台机器上的代理/负载均衡器/缓存后面运行,使localhost127.0.0.1 成为Apache 正在 运行的实际主机?
  • 您想要哪个 IP 地址,分配给机器上 NIC 的 IP 地址,还是用于从 Internet 访问机器的公共 IP?
  • @nikc 没有。但你认为它与 apache 有关吗?
  • @zaf — 您需要忘记服务器将传递给 PHP 的任何内容(这将是关于请求进入的接口)并开始明确检查本地计算机的网络详细信息.我不知道 PHP 是否对此有任何帮助,您可能需要掏空并调用 ifconfigipconfig 然后解析结果。请记住,这些输出因平台而异(因此编写便携式解析器不会很有趣),并且机器可以在同一个 LAN 上有多个接口(我想我曾经管理 4 个接口到一个网络)。
  • @zaf 通常的方法是忘记检查主机名/本地 IP 地址,而只使用来自$_SERVER 的值。有效的 HTTP/1.1 请求包含构建用于访问页面的完整 URL 所需的所有信息,这就是您应该使用的。你有什么不想这样做的原因吗?

标签: php linux apache network-programming


【解决方案1】:

恐怕一般来说这是不可能的 - 用于连接服务器的真实 IP 可能会在它到达服务器之前被翻译...

【讨论】:

  • 我对这一发现感到惊讶。
【解决方案2】:

如果您需要所有接口列表,请尝试system(); 执行 shell 的命令并将结果发送到网络服务器。例如:

system('ifconfig', $LIP);
system('ipconfig', $WIP);
echo "Linux:".$LIP."<br>Win:".$WIP."<br>;

【讨论】:

  • 可能会使用这样的东西。但是我需要在顶部添加一个缓存机制以避免在每个请求上都运行它。
  • 尝试检查is_file('/webroot/sysconfig.txt'); 如果为假:使用system('ifconfig &gt; /webroot/sysconfig.txt'); 如果为真:通过file_get_contents($path); 读取sysconfig.txt 这样您可以轻松地制作一个缓存机制;)
  • 是的,那是一种方式 :)
【解决方案3】:

试试这个:

$ip = getHostByName( $_SERVER['HTTP_HOST'] );

它应该解析访问站点的主机用户的IP。

例如,如果您通过http://localhost/ 访问您的网站,它将为您提供 127.0.0.1。但是对于http://www.mydomain.tld/,它应该返回 www.mydomain.tld 的 IP。

请注意,/etc/hosts 可能会影响名称解析,如果域在此处列出。

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多