curl 测试代理时,HTTP 000 到底是什么意思?
000 不是网站返回的真实 HTTP 状态码。结合 curl 的退出码、错误信息和 HTTP 输出字段,才能判断代理测试在哪一步失败。
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。先查明哪个操作没能走到最终响应。