网络手记
curl 显示 0 号退出码却是 404?分清传输成功与 HTTP 失败
用 curl 检查机场节点时,命令退出码是 0,却看到网页返回 404 或 500,并不矛盾。退出码回答“传输是否完成”,HTTP 状态码回答“服务器怎样处理请求”,必须同时记录。
两类状态分别代表什么
curl 默认把完整收到 HTTP 错误页面视为一次成功传输,因此即使服务器返回 404,命令也可能以 0 退出。curl 官方 FAQ 说明,可使用 --fail 让非成功 HTTP 响应导致错误;--fail-with-body 则在返回错误的同时保留响应正文,便于排查。
网络层失败则可能没有 HTTP 状态,例如 DNS 解析失败、连接超时或 TLS 校验失败。这时要看 curl 退出码和错误信息,而不是把状态码 000 当成服务器回复。
一条命令同时记录
对自己有权访问的固定测试页执行:
curl --silent --show-error --output response.txt \
--write-out "http=%{http_code} exit=%{exitcode} time=%{time_total}\n" \
https://example.com/test
如需让 HTTP 4xx、5xx进入失败分支,可加入:
--fail-with-body
不要只看屏幕最后一行。保留请求时间、HTTP 状态、curl 退出码以及少量脱敏错误信息;不要记录 Cookie、Authorization、订阅链接或完整响应中的个人数据。
用对照定位问题
exit=0且http=200:传输和服务器响应都完成,再检查正文是否正确。exit=0且http=404/500:网络路径已经到达服务器,问题更接近 URL、目标服务或上游响应。- 非零退出码且
http=000:优先看 DNS、TCP、TLS 或代理连接阶段。 - 换节点后状态码完全相同:不应把服务器业务响应误写成节点故障。
同一 URL 还应做直连、候选节点和另一网络对照。若只有某条路径无法建立连接,才继续检查节点或分流;若所有路径都收到同一个 4xx,应先核对请求本身。
验收方法
机场推荐测试报告应把“请求到达”“HTTP 处理成功”和“正文正确”分成三项。只有三项都满足,才能称为任务成功;这样可以避免把 404 当断网,也避免把退出码 0 当成页面可用。
评论