406 Not Acceptable

Accept ヘッダーに一致する表現がありません。

使いどころ

クライアントが JSON 専用の API に XML を要求しました。

よくある原因と対処法

406 は、サーバーが Accept ヘッダーを厳密に扱う場合に発生します。クライアントが application/xml や限定的なベンダータイプを要求し、サーバーはそれ以外しか生成できないケースです。Rails の respond_to ブロックや produces を指定した Spring のエンドポイントなど、一部のフレームワークはフォールバックせずに 406 を返します。Accept: application/json を送るかヘッダーを省略し、使っている HTTP クライアントがデフォルトで何を送っているかを確認してください。

共有ホスティングでは、ModSecurity などの Web アプリケーションファイアウォールが、ブロックしたリクエストに昔から 406 を返してきました。コンテンツネゴシエーションの問題に見えますが、実際はセキュリティルールによるものなので、WAF のログを確認するかホスティング会社に問い合わせてください。API を設計する場合、仕様上はサポートしていない Accept を無視してデフォルトの形式を返すことが認められており、たいていは 406 より親切です。

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

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

レスポンスでの表示

HTTP/1.1 406 Not Acceptable

返し方

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

確認方法

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

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