我想知道如何解决 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 中获得哪些更具体的信息?
它能够成功“连接”,那么这是否涉及一些双向通信?如果是这样,那么为什么响应也没有到来?请注意,我已验证我的服务已启动并返回响应。
请注意,我对这个级别的网络还不太熟悉,所以请随意提供一些通用的定位材料。
答案1
您可能需要从服务器端而不是客户端来排除此故障。我认为您混淆了“空响应”和“无响应”。它们的意思不同。您收到的回复可能不包含任何数据。
您可以通过简单地使用 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: */*
答案2
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
答案3
尝试这-> 不要通过 cURL,而是尝试使用 Telnet ping 您尝试访问的站点。您的连接尝试返回的响应将与 cURL 尝试连接时看到的完全一致(但它会毫无帮助地向您混淆)。现在,根据您在此处看到的内容,您可能会得出以下结论之一:
您正尝试连接到一个基于名称的虚拟主机网站,这意味着无法通过 IP 地址访问该网站。主机名出了问题 - 您可能输入了错误的内容。请注意,使用 GET 而不是 POST 作为参数将为您提供更具体的答案。
该问题也可能与 100-continue 标头有关。尝试运行 curl_getinfo($ch, CURLINFO_HTTP_CODE),然后检查结果。
答案4
在 Windows 的 WSL 下,某些情况下,在 bash 中运行 curl 会产生相同的错误,这是因为 Kasperksy 阻止它连接到 HTTP/s。
此错误已报告这里。
一个快速的解决方案是禁用您尝试访问的服务器端口上的卡巴斯基保护(例如 tcp 80)。
具体操作如下:进入卡巴斯基 - 设置 - 网络设置 - 勾选“仅监控选定端口” - 选择端口 - 双击端口(80)并选择非活动状态