Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Range リクエストの動作

最終更新 Markdown で表示Agent セットアップ

Cloudflare は、完全または部分的にキャッシュされたファイルから HTTP Range リクエストに応答できます。Origin Range Requests を使うと、Cloudflare はキャッシュ境界に揃えたバイト範囲で、対象ファイルをオリジンから取得します。

リクエストの対象条件

Cloudflare が部分ファイルのパスを使うのは、到着時点でキャッシュ対象の GET リクエストだけです。オリジン応答が後からキャッシュ不可と判明する場合もあります。その場合でも Cloudflare はオリジン Range 取得を使えますが、応答バイトは保存しません。

HEAD リクエストとその他のメソッドはこのパスを使いません。

HEAD リクエスト

Range を含む HEAD リクエストは、200 OK206 Partial Content304 Not Modified、または 416 Range Not Satisfiable を返すことがあります。HEAD 応答にボディはありません。206 Partial Content 応答には Content-Range が含まれます。Origin Range Requests なしで完全なキャッシュファイルを返す場合、一致する If-Range バリデーターは 206 Partial Content 応答を維持し、不一致の場合は 200 OK を返します。ほかの HEAD リクエストパスでは、Cloudflare は If-Range を無視します。

クライアント応答の動作

Range なしのリクエスト

Range なしの成功した無条件 GET は、完全なファイルを 200 OK として返します。コールドキャッシュミスでは、最初のオリジンリクエストも Range を省略します。

ファイルの一部だけがキャッシュされている場合、Cloudflare は不足バイトをオリジンに要求することがあります。クライアントは、それでも 1 つの完全な 200 OK 応答を受け取ります。

1 つの有効な範囲

次のリクエストは、成功時に 206 Partial Content を返します。

  • Range: bytes=100-199
  • Range: bytes=100-
  • Range: bytes=-100

Cloudflare は、ファイルサイズを超える終了位置を短くします。ファイルより大きいサフィックス範囲は、完全なファイルを 206 Partial Content として返します。

満たせない範囲

次の場合、Cloudflare は 416 Range Not Satisfiable を返します。

  • 空の範囲(例: bytes=
  • 長さ 0 のサフィックス(例: bytes=-0
  • 反転した範囲境界
  • ファイル末尾以降から始まる範囲
  • 空で非圧縮のファイルに対する範囲
  • Origin Range Requests が適用されるときの、重複または順序が乱れた範囲

Cloudflare が生成する 416 Range Not Satisfiable 応答のボディは空です。Content-Range: bytes */<FILE_SIZE> が含まれます。

Origin Range Requests なしで完全なキャッシュファイルを返す場合、Cloudflare は重複または順序が乱れた範囲を無視し、通常は完全なファイルを 200 OK として返します。

無視される Range ヘッダー

次の場合、Cloudflare はリクエストを非 Range リクエストとして処理します。

  • 範囲構文をパースできない
  • 範囲単位が bytes ではない
  • 数値が大きすぎてパースできない
  • ヘッダーに 300 を超える範囲がある、または Origin Range Requests なしで完全なキャッシュファイルを返すときにちょうど 300 の範囲がある

これは通常、完全なファイルを 200 OK として返します。条件付きリクエストは 304 Not Modified を返すことがあり、オリジンエラーも適用されます。

複数の範囲

Origin Range Requests が適用されるとき、2 から 300 の有効で昇順、重複しない範囲は、multipart の 206 Partial Content 応答を返します。満たせない個別範囲は Cloudflare が省略します。残る範囲が 1 つでも、応答は multipart のままです。残る範囲がなければ、Cloudflare は 416 Range Not Satisfiable を返します。

Origin Range Requests なしで完全なキャッシュファイルを返すとき、残る満たせる範囲が 1 つなら、単一範囲の 206 Partial Content 応答になります。

条件付きリクエスト

If-None-MatchIf-Modified-SinceRange より優先されます。304 Not Modified 応答を生成することがあります。

それ以外では、キャッシュされた ETag または Last-Modified の値と完全一致する If-Range 値は Range の動作を維持します。不一致の場合、Cloudflare は Range を無視し、完全応答のパスを使います。

展開

完全なエンコード済み応答を展開する必要がある場合、Cloudflare は Range を無視します。完全な非圧縮ボディを 200 OK として送ります。これはキャッシュ応答と、オリジンから受け取った応答の両方に適用されます。

空のエンコード済み応答に対する Range リクエストは、空の 200 OK を返します。416 Range Not Satisfiable ではありません。

オリジンリクエストの動作

Cloudflare はオリジン Range リクエストを 1 MiB のキャッシュ境界に揃えます。たとえば、クライアントが 1 KiB の範囲を要求すると、Cloudflare はオリジンから 1 MiB の範囲を取得し、クライアントには要求された 1 KiB だけを返すことがあります。1 つのクライアントリクエストを、複数の単一範囲オリジンリクエストに分割することもあります。オリジンが見る Range の値は、クライアントのヘッダーと異なる場合があります。オリジンログ、リクエスト制限、レート制限、リクエスト署名を設定するときは、この動作を考慮してください。

Cloudflare は、Origin Range Requests が生成するすべてのオリジンリクエストに Accept-Encoding: identity を追加します。これには、この機能が扱う完全ファイルの GET も含まれます。Cloudflare とクライアント間の通常の圧縮は無効になりません。

部分応答の要件

Cloudflare がオリジンの 206 Partial Content 応答をキャッシュするには、応答が次の要件を満たす必要があります。

応答フィールド 要件
Content-Encoding 応答は非エンコードである必要があります。
Content-Range 具体的な範囲を含めます。開始は Cloudflare のリクエストと一致する必要があります。終了は、要求された終了またはファイル末尾のうち先に来る方と一致する必要があります。完全なファイルサイズを含めます。
Content-Length 返した区間の長さと等しい数値を含めます。
Transfer-Encoding このヘッダーを省略します。
ETag 任意です。ある場合、同じキャッシュ表現に対する応答間で、有無と正確な値が一貫している必要があります。

完全なファイルサイズも、応答間で一貫している必要があります。違反すると、キャッシュできなかったり、クライアントへ返す応答が途中で終了したりします。

Range を尊重しないオリジン応答

オリジンが Cloudflare 生成の Range ヘッダーを無視し、完全な 200 OK を返す場合、Cloudflare はその応答を使えます。Cloudflare は完全なファイルをダウンロードし、その後クライアントに要求された範囲を返すことがあります。

オリジンがエンコード済みの 206 Partial Content 応答を返す場合、Cloudflare はそれをキャッシュしません。クライアント応答が始まる前なら、キャッシュせずにその単一応答を送ることがあります。応答が始まった後は、Cloudflare は途中で終了し、クライアントは約束より少ないバイトを受け取ります。

複数リクエストから組み立てる応答の途中で、ほかの互換性のないオリジン応答が出た場合も、クライアント応答が途中で終了することがあります。

キャッシュの制限

Origin Range Requests は、本来対象外のリクエストや応答をキャッシュ可能にはしません。Cloudflare は キャッシュ可能な最大ファイルサイズ を、Content-Range の完全サイズと照合します。小さい範囲を要求しても、この制限は回避できません。

Origin Range Requests は Cache Reserve とは併用できません。

役に立ちましたか?