412 Precondition Failed

条件付きヘッダーが一致しませんでした。

使いどころ

古い ETag を指定した If-Match。更新の消失を防ぎます。

よくある原因と対処法

412 は、クライアントが付けた条件が成り立たなかったことを意味します。たいていは、他の誰かが先にリソースを更新したために If-Match の ETag が一致しなくなり、サーバーがその変更の上書きを拒否したケースです。クライアントは現在のバージョンを GET し、マージするかユーザーに確認してから、新しい ETag で再試行します。If-Unmodified-Since は日付で同じことを行います。

If-Match には強い比較が必要なので、W/ プレフィックス付きの弱い ETag は決して一致しません。また、レスポンスを圧縮するプロキシが ETag を弱めることがあり、そうなるとすべての書き込みが 412 で失敗します。逆に、PUT で If-None-Match: * を使うと、リソースが既に存在する場合に作成が 412 で失敗するので、上書きを防ぐ手軽なガードになります。S3 と Google Cloud Storage も、条件付き書き込みに 412 を使います。

クライアントエラー (4xx)

4xx はクライアントエラーです。リクエスト自体が誤っている、認証されていない、または存在しないものを指しています。同じリクエストを再試行しても解決しません。

レスポンスでの表示

HTTP/1.1 412 Precondition Failed

返し方

Node.js / Expressres.status(412).end()
Python / Flaskreturn '', 412
nginxreturn 412;

確認方法

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

HTTP ステータスコードを開く