HTTP 状态码是接口的一部分。浏览器可能渲染出一个友好的页面,但监控、爬虫、缓存与 API 客户端也需要状态码与响应头来讲述同一个故事。

旧端点收到 POST 后返回带 Location 的 308;解析 Location 后,客户端可向新端点发送 POST。307 与 308 保留方法,301 与 302 允许把 POST 改为 GET。另设缺失分支,404 表示暂时或未知的缺失,410 表示很可能永久不可访问;两者都不说明原因,友好错误页也须保留正确的非 200 状态。Location 可为相对引用,须以原 URI 为基准解析。308 缓存受方法与缓存控制限制,缓存可能比配置存续更久。curl 不加 --location 不会跟随。
有意选择迁移或缺失语义。保留所需方法,解析 Location,考虑缓存,并让错误页状态与事实一致。

永久移动并不都等价

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

在错误路径上也应保留安全响应头。安全头、有用的内容类型与正确的状态码,比一个装饰性的错误动画更有价值。

来源