卷曲:在不同的服务器上返回不同的IP地址

时间:2011-12-20 16:02:52

标签: php command-line curl

我一直在努力弄清楚为什么我在PHP中使用curl库的页面在我的开发计算机上运行但在远程服务器上失败了。有人怀疑它与curl是否有SSL支持有关,如one of the comments here所示:

  

如果您的curl安装没有使用SSL支持进行编译,那么当您试图弄清楚为什么curl_exec()失败或做其他任何事情时,您会在墙上撞到墙头......

因此,我运行this script以确定我的开发计算机远程服务器是否支持SSL。我的 dev machine 远程服务器都产生了以下内容(看起来都支持SSL):

  

CURL_VERSION_IPV6匹配CURL_VERSION_KERBEROS4与CURL_VERSION_SSL匹配不匹配CURL_VERSION_LIBZ匹配

但是,当我从远程服务器(我的脚本失败的那个)的命令行运行curl时,这是我得到的(即curl挂起) :

curl -v http://<my-domain>/blog/press-release/
* About to connect() to <my-domain> port 80
*   Trying 66.201.45.235... 

相同的curl命令行在我的开发计算机上工作正常,尽管它返回了不同的IP地址:

curl -v http://<my-domain>/blog/press-release/
* About to connect() to <my-domain> port 80 (#0)
*   Trying 10.3.1.207... connected

请...请帮帮忙?是否有其他方法可以找出我的开发计算机远程服务器上安装的curl之间的差异? 为什么他们会返回不同的地址?

1 个答案:

答案 0 :(得分:2)

域名(如my-domain.com)通过DNS解析为IP地址。

当程序尝试按名称访问网络设备时,操作系统会联系其配置的DNS服务器,并要求其提供与提供的名称对应的IP地址。然后,DNS服务器将使用IP地址(或一组IP地址进行响应 - 可以配置一个名称以解析为多个IP地址)或一条错误消息,其中说“实际上”我找不到名称”。操作系统还将具有hosts file,这是静态配置的域到IP映射的列表。如果主机文件中的请求域匹配,则不会联系DNS服务器,而是使用配置的IP。

公司局域网通常拥有自己的内部DNS服务器来控制内部域,如果它获得该域成员的请求,它将返回该主机的LAN IP地址,而不是WAN IP地址

我对你的问题的猜测是发生了两件事之一:

  • 您的开发服务器上的主机文件具有相关域的已配置条目,该条目位于您的网络内部。我这样说是因为您在开发机器上获得的地址解析为通常为LAN保留的范围内的IP地址
  • 您尝试联系的计算机位于您自己的域中,托管在您的开发计算机所在的网络中,并且您的LAN有一个DNS服务器,用于控制您的域,由您的开发计算机用于DNS查找。

无论哪种方式,您需要解决的实际问题是您尝试联系的主机不接受来自66.201.45.235地址的WAN的连接,这是因特网将其IP地址视为。这可能是因为服务器配置,防火墙,NAT或许多其他任何事情。

这可能与SSL无关 - cURL正在尝试连接到端口80,端口80用于未加密的HTTP连接,并且不需要SSL。

您应与网络管理员联系以解决此问题。