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

新手上路,请多包涵

我正在开发一个仅在企业本地网络上运行的 PHP 应用程序。该应用程序将使用自定义安装程序安装到服务器,就像我们使用 Stunnix Advanced Webserver 制作的一样。

作为使应用程序更加用户友好的一部分,我计划显示服务器的 本地 IP ,以便网络中的其他计算机只需在地址栏中键入此 IP 即可轻松访问该应用程序。

问题是我无法获取服务器的 本地 IP

我努力了

SERVER_NAME (仅显示 127.0.0.1)

REMOTE_ADDR (显示客户端外部 IP)

SERVER_ADDR 显示正确的 IP,但只有当我使用完全违背其目的的 IP 从客户端访问它时,它才会显示正确的 IP。

我只想在通过 http://localhost 本身直接从服务器访问时显示服务器的 本地 IP

我有点确定这是不可能的。但如果是,请帮助。

编辑

我正在开发一个跨平台的 PHP 服务器应用程序之类的东西。我们将 Apache、PHP 安装程序和 SQlite 数据库作为一键式安装程序与我们的 PHP 应用程序捆绑在一起,以使其尽可能对用户友好。任何人都可以将其部署在运行 Windows、Mac 或 Linux 的计算机上。安装后,当用户在服务器上打开应用程序时,他可以看到 ip 地址 [本地 ip] 和可用于连接到该服务器的端口。该应用程序将仅在本地网络上运行,而不会在 Internet 上运行。

它应该像名为 Air Droid 的 Android 应用程序一样显示本地 IP。截图: https ://lh3.ggpht.com/PmLopRm-Lj9WTnzm2MBI-bTbCLopAyqtd4C_4nvyDwLg8X0QwDbBbEREdWGHG5xku4s

原文由 ajaybc 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

原文由 DaveRandom 发布,翻译遵循 CC BY-SA 3.0 许可协议

解决方案:

  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 地址。

原文由 Ilya Sheershoff 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏