我正在使用需要机器外部IP的API。 据我所知,我使用的PHP环境只能得到我们的内部IP。
桌面上的选项是使用一个外部服务,如whatismyip.com告诉我们:
wget -q -O - http://whatismyip.com/automation/n09230945.asp
我担心如果失败会发生什么。 是否有一种不依靠外部服务来确定机器IP的防弹方法?
没有。因为NAT应该是透明的,因为NAT可以在计算机本身做任何事情。 你可以打赌(检查IP地址对定义的私人领域),但这也不是子弹的certificate。
这将是更多的StackOverflow问题,但我会咬! 假设不涉及端口转发或负载平衡,可以使用$_SERVER['SERVER_ADDR']variables获取脚本运行的IP地址。
另一个问题是,它可能不是从脚本的任何连接的IP地址。 举个例子,如果你有一个主IP地址为192.0.2.1的服务器,并且一个辅助IP地址为192.0.2.2的脚本运行的SSL站点。 当你使用上面的variables时,返回的IP将是192.0.2.2,但是当你在sciprt中创build出站连接时,它将从192.0.2.1开始,除非你专门绑定到192.0.2.2。
因为你说内部和外部我假设你使用某种types的防火墙,为你做nat。 如果这种情况是不可能从您的本地脚本告诉你有什么IP,这是因为一旦networking数据包离开你的箱子,你不能告诉它会发生什么。
一个简单的解决scheme是使用一些外部服务器(一些免费托pipe)或有一个外部服务器,你从PHP调用,并返回给你的IP地址,正如指出arraysSERVER持有这个信息。 如果你有更多的服务器,你可以打电话给下一个,等等。
您可以使用不同的ISP设置另一台服务器,并编写自己的whatismyip.com版本,并在您控制的硬件上运行。
您最好的办法是使用多个外部来源来处理您的IP信息。 除了whatismyip,如果不是全部,DDNS提供者(例如DynDNS)也有类似的服务。 如果您无法从一个站点获取信息,请尝试下一个站点。