HTTPQUERY
日本語

416 Range Not Satisfiable

使い方

416 Range Not Satisfiable のエラーメッセージを受け取った場合、クライアントは Range ヘッダーを使って部分コンテンツを要求しています。バイト範囲については、指定された範囲の最初のバイトがリソースの長さを超えている場合にこのエラーが返されます。

部分的な範囲が要求される理由の1つは大きなファイルの転送で、クライアントがファイルをチャンク単位でダウンロードしたい場合です。リクエストで Range ヘッダーを使うことで、ファイルは事実上、分割して任意の順序でダウンロードされます。

サーバーがリクエストを満たし、要求された範囲の少なくとも1つをリソースの部分集合として返す場合、成功を示す 206 が返されます。サーバーには、範囲リクエストを無視してリソース全体を 200 ステータスで返す選択肢もあります。

レスポンスの一部として、サーバーは現在のデータ長を指定する Content-Range ヘッダーを作成します。

Content-Range: bytes */512

区切り文字 / の前のアスタリスク * は満たせない範囲であることを示し、その後にリソースの総サイズが続きます。

SEO への影響

Google のような検索エンジンは、416 のレスポンスステータスを持つ URL をインデックスしません。以前にインデックスされていた URL は検索結果から削除されます。

例

クライアントがリソースの 1000 バイト目から 2000 バイト目を要求します。ファイルの長さが 512 バイトしかないため、サーバーは 416 Range Not Satisfiable を返します。サーバーから返された総サイズの情報を使って、クライアントは有効な範囲でリクエストを作り直します。

リクエスト

GET /documents/main HTTP/1.1
Host: example.com
Range: bytes=1000-2000

レスポンス

HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */512

サーバーが範囲を無視する場合の代替レスポンス

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 512

<entire 512 bytes in message body>

対処方法

Range ヘッダーがリソースの境界外のバイト範囲を指定しています。最も一般的な原因は、ファイルの終端を超えるバイトを要求することです(たとえば、512 バイトしかないファイルに対して 1000-2000 バイト目を要求するなど)。

まずリソースのサイズを検証します。範囲リクエストを組み立てる前に HEAD リクエストを送って Content-Length ヘッダーを読み取ります。これにより、ファイル境界を超えるバイトの要求を防げます。

バイト範囲の計算を確認します。バイト範囲はゼロ始まりで、両端を含みます。512 バイトのファイルの有効なバイト位置は 0 から 511 です。bytes=0-511 の範囲はファイル全体を要求します。範囲計算での off-by-one(1つのずれ)は 416 レスポンスの頻出の原因です。

リソースの変化に対処します。ダウンロードを再開する際、サーバー上のファイルが前回の部分リクエスト以降に変更または削除されている可能性があります。以前のバージョンでは有効だった範囲が、より短い、あるいは異なるファイルでは無効になります。再開の前にリソースのサイズを再確認してください。

Range ヘッダーを削除します。部分コンテンツが不要な場合は、Range ヘッダーを外してリソース全体を要求します。サーバーは代わりに完全なボディを伴う 200 を返します。

ブラウザのキャッシュを消去します。ブラウザが部分レスポンスをキャッシュし、次回以降の訪問で無効な範囲リクエストを組み立てることがあります。キャッシュを消去すると、新たに完全なリクエストが行われます。

サーバー側の考慮事項。一部のサーバー設定は、範囲リクエストをサポートするリソースの種類を制限します。対象のリソースに対するレスポンスでサーバーが Accept-Ranges: bytes を送っていることを検証してください。Accept-Ranges: none が存在する場合、そのサーバーはそのリソースの部分リクエストをまったくサポートしていません。

メディア読み込みの失敗

ブラウザの動画プレーヤーや音声プレーヤーは、メディアファイルをストリーミングするために範囲リクエストを送信します。再生中の 416 エラーは、プレーヤーがファイル境界を超えるバイト範囲を要求したことを意味します。これは、プレーヤーが古い Content-Length の値を保持しているあいだにメディアファイルがより短いバージョンへ置き換えられた場合に起こります。ページを再読み込みすると、プレーヤーは範囲を要求する前に現在のファイルサイズを取得します。

コードリファレンス

.NET

HttpStatusCode.RequestedRangeNotSatisfiable

Rust

http::StatusCode::RANGE_NOT_SATISFIABLE

Rails

:range_not_satisfiable
:requested_range_not_satisfiable

Go

http.StatusRequestedRangeNotSatisfiable

Symfony

Response::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE

Python3.5+

http.HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE

Java

HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE

Angular

@angular/common/http/HttpStatusCode.RangeNotSatisfiable