HTTP 状态码是接口的一部分。浏览器可能渲染出一个友好的页面,但监控、爬虫、缓存与 API 客户端也需要状态码与响应头来讲述同一个故事。
永久移动并不都等价
308 Permanent Redirect 在保留请求方法的同时,传达资源有了新的永久 URI。这对发送 POST、PUT 或其他非 GET 方法的客户端很重要。旧页面到新页面的重定向用 GET 很容易测试;端点的迁移则必须用真实调用方实际使用的方法来测试。
curl -sS -D - -o /dev/null --max-redirs 0 \
https://old.example.test/api/item
检查 Location 是否为绝对地址或正确锚定、目标是否是预期主机,以及响应是否被静默降级为临时重定向。308 默认可缓存,因此只有在有意识的迁移计划时才改动它。
区分"缺失"与"被移除"
当服务器找不到当前表示且缺失可能是暂时或未知时,使用 404 Not Found。410 Gone 更强:它表示资源被有意移除且不太可能回归。两者都应有帮助人类的正文,但都不应因为自定义错误页成功渲染就返回 200。
这条检查应放在边缘:
curl -sS -o /tmp/missing.html -w '%{http_code} %{url_effective}\n' \
https://www.example.com/a-route-that-does-not-exist
在错误路径上也应保留安全响应头。安全头、有用的内容类型与正确的状态码,比一个装饰性的错误动画更有价值。
来源
- RFC 9110 — HTTP Semantics,第 15 与 13 节,已核验 2026-08-22。
- RFC 7538 — 308 Permanent Redirect,第 3 节,已核验 2026-08-22。
- curl manual,状态与重定向检查标志,已核验 2026-08-22。