我想知道如何进行故障排除为什么curl请求到Web服务器不起作用。 我不是在寻找那些依赖于我的环境的帮助,我只是想知道如何收集关于通信失败的部分,端口号等的信息。
chad-integration:~ # curl -v 111.222.159.30 * About to connect() to 111.222.159.30 port 80 (#0) * Trying 111.222.159.30... connected * Connected to 111.222.159.30 (111.222.159.30) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0 OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10 > Host: 111.222.159.30 > Accept: */* > * Empty reply from server * Connection #0 to host 111.222.159.30 left intact curl: (52) Empty reply from server * Closing connection #0
所以,我明白一个空的回应意味着curl没有得到服务器的回应。 没问题,这正是我想要弄清楚的。
但是,我可以从这里的cURL中获得更具体的信息吗?
它能够成功地“连接”,所以不涉及一些双向通信? 如果是这样的话,为什么回应也不来? 请注意,我已经validation了我的服务已经启动并正在返回响应。
请注意,在这个networking层面,我有点绿色,所以请随时提供一些一般的方向材料。
您可能需要从服务器端解决这个问题,而不是客户端。 我相信你把“空洞的回应”和“没有回应”混为一谈。 他们不是这个意思。 有可能你得到的答复不包含任何数据。
你可以通过简单地使用telnet来testing,而不是通过curl:
telnet 111.222.159.30 80
一旦连接,粘贴以下(从你的curl输出):
GET / HTTP/1.1 User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0 OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10 Host: 111.222.159.30 Accept: */*
你应该看到curl看到的回应。
你得到一个空的答复的一个可能的原因是,你试图打一个网站是一个基于名称的虚拟主机。 如果是这样的话,根据服务器configuration(您尝试访问的站点恰好被configuration为默认站点),您无法通过IP地址访问站点,而无需一点点工作。
您可以通过简单地更改上面的“主机”行来在客户端进行testing。 将www.example.comreplace为您尝试访问的网站:
GET / HTTP/1.1 User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0 OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10 Host: www.example.com Accept: */*
curl很好,但是当事情出错时不会给出太多反馈。 (正如你所看到的)wget可能会给你更多的信息,但是正如yoonix所提到的,服务器端(即web服务器错误日志)是需要查看的地方。
wget -S -O /dev/null http://www.example.com
你也可以设置主机名
wget -s -O /dev/null --header="Host: foo.bar" http://www.example.com
试试这个 – >而不是通过cURL,尝试ping你试图通过Telnet访问的站点。 连接尝试返回的响应将正是cURL在尝试连接时看到的内容(但是它不会帮助您进行混淆)。 现在,根据你在这里看到的情况,你可以得出几个结论之一:
您正在尝试连接到基于名称的虚拟主机的网站,这意味着无法通过IP地址访问该网站。 主机名出了什么问题 – 您可能错误地input了一些内容。 请注意,使用GET而不是POST参数将给你一个更具体的答案。
这个问题也可能与100-continue头相关联。 尝试运行curl_getinfo($ ch,CURLINFO_HTTP_CODE),并检查结果。