我正在使用一个需要机器外部 IP 的 API。据我所知,我使用的 PHP 环境只能获取我们的内部 IP。
桌面上的选项是使用外部服务(例如 whatismyip.com)来告诉我们:
wget -q -O - http://whatismyip.com/automation/n09230945.asp
我担心的是如果失败了会发生什么。有没有一种万无一失的方法可以在不依赖外部服务的情况下确定机器的 IP?
答案1
不。因为 NAT 应该是透明的,所以几乎不可能在计算机上执行任何操作。您可以打赌(根据定义的私有区域检查 IP 地址),但这也不是万无一失的。
答案2
这更像是 StackOverflow 的问题,但我还是会回答!假设不涉及端口转发或负载平衡,您可以使用变量$_SERVER['SERVER_ADDR']
来获取脚本正在运行的 IP。
另一个问题是,它可能不是脚本发出的任何连接的 IP。例如,如果您的服务器的主 IP 为 192.0.2.1,而脚本正在运行的 SSL 站点的辅助 IP 为 192.0.2.2。当您使用上述变量时,返回的 IP 将为 192.0.2.2,但是当您在脚本中创建出站连接时,它将来自 192.0.2.1,除非您专门绑定到 192.0.2.2。
答案3
因为您说内部和外部,所以我假设您使用某种为您执行 nat 的防火墙。如果是这种情况,则不可能从您的本地脚本中判断您拥有什么 ip,这是因为一旦网络数据包离开您的盒子,您就无法判断会发生什么。
一个简单的解决方案是使用一些外部服务器(一些免费托管)或有一个从 php 调用的外部服务器并返回您的 ip 地址,正如指出的数组 SERVER 保存此信息。如果您有多个服务器,您可以调用下一个服务器,依此类推。
答案4
最好的办法是使用多个外部源来获取您的 IP 信息。除了 whatismyip 之外,大多数(如果不是全部)DDNS 提供商(例如 DynDNS)都提供类似的服务。如果您无法从一个站点获取信息,只需尝试列表中的下一个站点即可。