意味
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\"."
} 仕様
よくある質問
› 楽観的同時実行制御とは?
クライアントは読み取ったときの ETag を If-Match で送り、その間にリソースが変わっていればサーバーが 412 で書き込みを拒否します。
› 412 と 428 の違いは?
412:送った前提条件が成り立たなかった。428:そもそも前提条件を送る必要がある。