含义
请求头中的前提条件(如 If-Match 或 If-Unmodified-Since)判定为假,因此服务器没有执行该请求。
常见原因
- 资源已被他人更新(ETag 已改变)
- If-Match 使用了过时的缓存 ETag
- 条件上传时存储中已有更新的对象
解决方法
客户端或访问者
重新 GET 资源以获取当前 ETag,重新应用修改后再发送。
网站或 API 的维护者
返回当前 ETag,并让条件检查与写入操作保持原子性。
响应示例
HTTP/1.1
HTTP/1.1 412 Precondition Failed
Date: Tue, 07 Oct 2025 09:30:00 GMT
Server: nginx
ETag: "v8"
Content-Type: application/problem+json
{
"type": "about:blank",
"title": "Precondition Failed",
"status": 412,
"detail": "If-Match \"v7\" does not match the current version \"v8\"."
} 规范
常见问题
› 什么是乐观并发控制?
客户端用 If-Match 发送读取时的 ETag;如果资源在此期间被修改,服务器以 412 拒绝写入。
› 412 和 428 的区别?
412:你的前提条件不成立。428:你必须提供前提条件。