当curl获得“空响应”时如何解决连接问题


27

我想知道如何进行故障排除,为什么对Web服务器的curl请求不起作用。我并不是在寻求依赖于我的环境的帮助,我只是想知道如何收集有关通信的哪一部分发生故障,端口号等的信息。

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导出哪些更具体的信息?

它能够成功地“连接”,所以这不涉及某种双向通信吗?如果是这样,那为什么还没有回应呢?请注意,我已经验证了我的服务已启动并且正在返回响应。

请注意,在这个网络级别上,我有点绿色,请随时提供一些一般性的指导材料。


1
我遇到了同样的错误,但就我而言,是VPN软件拦截并阻止了某些网络流量。详情请参阅:stackoverflow.com/a/24189367/703200
克里斯·巴特利

Answers:


16

您可能需要从服务器端而不是客户端进行故障排除。我相信您会混淆“空响应”与“无响应”。他们不是同一件事。您可能会收到不包含任何数据的答复。

您可以使用telnet而不是通过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所看到的完全相同。

您收到空回复的一个可能原因是您试图访问的网站是基于名称的虚拟主机。在这种情况下,根据服务器配置(您尝试访问的站点恰好被配置为默认站点),您需要一点点工作就无法通过IP地址访问该站点。

您只需更改上面的“主机”行即可在客户端进行测试;将www.example.com替换为您要访问的网站:

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: */*

我能够成功地从另一个客户端获取页面。我认为,这特定于客户端可能会使用的某些网络。
2013年

而且,至于空响应=无响应,我是从stackoverflow.com/questions/5929971/…那里得到的 ,但我愿意考虑第二点意见;)
2013年

1
您仍然需要从服务器端对其进行故障排除。如果服务器未发送数据,则客户端将不知道原因。它只知道它没有得到。至于空与否,我发现一台卷曲的服务器抱怨“空”响应,我肯定收到了响应。 * Empty reply from server从curl出发,直接显示所有相关的http标头,其中的正文纯粹由组成<!-- b5 -->。如果它与其他地方的curl兼容,而不是在一个特定的网络上兼容,那么我将看一下该网络上的差异。行为不佳的代理也许吗?
yoonix

7

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

2

试试这个 ->而不是通过cURL,而是尝试ping通您要通过Telnet访问的站点。您的连接尝试返回的响应将与cURL尝试连接时看到的完全一样(但会无益地混淆您)。现在,根据您在这里看到的内容,您可能会得出以下结论之一:

您正在尝试连接到基于名称的虚拟主机的网站,这意味着无法通过IP地址访问该网站。主机名出了点问题–您可能输入了错误的内容。请注意,使用GET而不是POST作为参数将为您提供更具体的答案。

该问题也可能与100个继续标头有关。尝试运行curl_getinfo($ ch,CURLINFO_HTTP_CODE),然后检查结果。


1
注意(因为我看到您在不同的cURL问题中发布了相同的答案):这些问题与cURL,CLI二进制文件有关,而不与您所引用的PHP包装器实现有关。换句话说,没有getinfo用于CLI cURL 的标志或功能。@see curl.haxx.se

0

在某些情况下使用Windows的WSL。在bash中运行curl将产生相同的错误,这是因为Kasperksy阻止了它连接到HTTP / s。

此错误已在此处报告。

一种快速的解决方案是在您尝试连接到服务器的端口上禁用卡巴斯基的保护(例如,TCP 80)。

这可以通过以下方法完成:转到卡巴斯基-设置-网络设置-选中“仅监视选定的端口”-选择端口-在端口上双击两次(80),然后选择不活动

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.