curl 测试把 HTTP 状态输出为 000,说明它没有拿到可供报告的最终 HTTP 响应码。并不是网站真的返回了一个名为 000 的 HTTP 状态。

把错误信息也一并记录

下面的 POSIX shell 示例会输出最终 HTTP 字段、CONNECT 字段,以及 curl 进程的退出码:

curl --proxy http://203.0.113.10:8080 --noproxy '' --connect-timeout 5 --max-time 15 --silent --show-error --output /dev/null --write-out 'http=%{http_code} connect=%{http_connect}\n' https://example.com/
result=$?
printf 'curl_exit=%s\n' "$result"

把示例端点换成你的 HTTP 代理,或从HTTP 代理列表选一个候选。保留 show-error:错误信息往往最有用。使用隧道时,CONNECT 字段才有相应意义;它不是网站返回的第二个最终状态。

把几项结果放在一起看

  • 连接代理失败时,HTTP 字段可能停留在 000。
  • 收到响应前超时,也可能得到同样的结果。
  • CONNECT 响应成功,但随后TLS 失败,可能显示 connect=200、http=000。
  • 网站已完整返回 403 之类的响应则不同:此时有真实的 HTTP 响应可以检查。

具体退出码和错误信息能缩小原因范围。判断失败发生在查找代理、连接其端口、协商隧道,还是验证目标站点的阶段。

别把所有结果都简化成状态码检查

脚本若只保存 http_code,就丢掉了传输错误。还应保存进程执行结果,以及去除敏感信息后的错误消息。反过来,除非使用适当的 fail 选项,即使网站返回错误状态,curl 也可能成功完成传输。HTTP 响应和客户端执行结果回答的是两回事。

不要靠关闭 TLS 验证或随意添加请求头来修复 000。先查明哪个操作没能走到最终响应。

相关文章