HTTP 状态码是接口的一部分。浏览器可能渲染出一个友好的页面,但监控、爬虫、缓存与 API 客户端也需要状态码与响应头来讲述同一个故事。
永久移动并不都等价
308 Permanent Redirect 在保留请求方法的同时,传达资源有了新的永久 URI。这对发送 POST、PUT 或其他非 GET 方法的客户端很重要。旧页面到新页面的重定向用 GET 很容易测试;端点的迁移则必须用真实调用方实际使用的方法来测试。
curl -sS -D - -o /dev/null https://old.example.test/api/item
不带 --location 时,curl 不会跟随重定向。相对原 URI 解析 Location:绝对 URI、根相对路径或其他相对引用都可能有效。检查解析后的主机、路径与协议。301/302 允许将 POST 改为 GET;307/308 保留方法。改变状态的方法只能在隔离端点测试。308 可以启发式缓存,但仍受方法与缓存控制限制,因此缓存的迁移结果可能在服务器配置变化后继续存在。
如果目的是在完成操作后展示结果,303 See Other 会指向客户端可用 GET 或 HEAD 获取的另一资源。它不是要求客户端在新地址重放原来的写入操作;应有意选择这种行为,而不是把所有重定向都当作迁移。
区分"缺失"与"被移除"
当服务器找不到当前表示且缺失可能是暂时或未知时,使用 404 Not Found。410 Gone 更强:它表示资源已不可访问,且这种情况很可能是永久的;它并不能说明资源消失的原因。两者都应有帮助人类的正文,但都不应因为自定义错误页成功渲染就返回 200。
404 也可以用于隐藏某个禁止访问的资源是否存在。404 与 410 都可以启发式缓存,但仍受方法与缓存控制约束。应为错误响应明确选择缓存策略:路由修复后,已缓存的缺失结果仍可能继续显示。
这条检查应放在边缘:
curl -sS -D missing.headers -o missing.html -w '%{http_code} %{url_effective}\n' \
https://www.example.test/a-route-that-does-not-exist
在错误路径上也应保留安全响应头。安全头、有用的内容类型与正确的状态码,比一个装饰性的错误动画更有价值。
来源
- RFC 9110 — HTTP Semantics,第 15 与 13 节,已核验 2026-07-14。
- RFC 7538 — 308 Permanent Redirect,第 3 节,已核验 2026-07-14。
- curl manual,状态与重定向检查标志,已核验 2026-07-14。