基本仕様

エッジキャッシュCDNは、オリジンサーバーからコンテンツを取得し一定期間エッジサーバーでキャッシュ後、 コンテンツを返却します。

プロトコル

HTTPおよびHTTPSプロトコル配信に対応しています。

バージョン

HTTP/1.1 HTTP/2 HTTP/3 に対応しています。

注釈

HTTP/2 HTTP/3 についてはHTTPS(SSL)通信が必須となります。

HTTPメソッド

エッジキャッシュは、以下のリクエストを受け入れてオリジンサーバーに転送します。 これら以外のメソッドは、なにも加工することなくオリジンサーバーに転送します。

  • GET

  • HEAD

  • PUT

  • POST

  • TRACE

  • OPTIONS

  • PATCH

  • DELETE

リクエストの最大長と URL の最大長

パス、クエリーストリング、ヘッダーを含め、リクエストの最大長は 20480 バイトです。

リクエストまたは URL がこの制限を超えるとリクエストヘッダーフィールドが長すぎることを示す HTTP ステータスコード 413 (Request Header Fields Too Large) を 返却し、TCP 接続を終了します。

リクエストヘッダー

エッジキャッシュ仕様書に定めがない限りオリジンサーバーに転送します。

レスポンスヘッダー

エッジキャッシュでは、判定用にいくつかのレスポンスヘッダーを追加します。

red-cacheヘッダー(キャッシュ状態判定ヘッダー)

説明

HIT

キャッシュが存在する

MISS

キャッシュが存在しなくオリジンサーバーから取得

PASS

キャッシュを行わない

'-'

エラーを返却した場合

オリジンサーバーの指定方法

コンテンツ取得先であるオリジンサーバーの指定は、IPアドレスまたはドメイン名を利用可能です。

エッジキャッシュは、内部的にオリジンサーバーのIPアドレスを最大5分キャッシュします。 そのため、オリジンサーバーのドメイン名に紐づくIPアドレスを変更した場合は、反映までにドメインに指定された TTL+5Min かかります。

警告

IPアドレスで直接指定することは推奨していません。そのため、オリジンサーバー専用のAレコードを準備いただき 割り当てることをお勧めしております。

カスタムオリジンへのリクエスト

HTTP/1.1 を使用してカスタムオリジンにリクエストを転送します。

対応プロトコル

HTTP または HTTPS

追加するヘッダー

エッジキャッシュはリクエストが発生した際、以下のヘッダを付与しオリジンサーバーにリクエストします。

X-Forwarded-For

クライアントIPを X-Forwarded-For に格納後、オリジンサーバーにリクエストします。 CDN経由のアクセスの場合、オリジンサーバーからみるとエッジキャッシュCDNのIPアドレスが クライアントIPとして認識されます。そのため、オリジンサーバー側でクライアントIPアドレスに基づいて アクセス制限やリダイレクトを制御している場合は、 X-Forwarded-For 内の実IPアドレスをご利用下さい。

X-Forwarded-Proto/X-Forwarded-Redbox-Proto

リクエストプロトコル(HTTPまたはHTTPS)を X-Forwarded-Proto 及び X-Forwarded-Redbox-Proto 内に格納後、オリジンサーバーにリクエストします。 HTTPSリクエストの場合でも、CDNからオリジンサーバーまでの通信はHTTPで通信されます。 そのため、リクエストプロトコルをオリジンサーバーで判別し動作を制御している場合は、 X-Forwarded-Proto または X-Forwarded-Redbox-Proto 内のプロトコル名をご利用下さい。

注釈

オリジンサーバーの上位にProxyサーバーやロードバランサーが入っている場合やホスティング事業者側の都合でX-Forwarded-Protoヘッダを削除してしまう場合があります。 その際は、X-Forwarded-Protoの代わりにX-Forwarded-Redbox-Protoをご利用下さい。

削除するヘッダー

リクエストヘッダーにProxyが含まれてる場合は、これらを削除しオリジンサーバーにリクエストします。

カスタムオリジンからのレスポンス

オリジンサーバーからのレスポンス時に、エッジキャッシュCDNがどのような振る舞いをするかを掲載しています。

削除するヘッダー

レスポンスヘッダに以下の値が付与されている場合、ヘッダを削除後クライアントに返却します。

  • Vary(User-Agent)

  • Trailer

  • Warning

  • Server

Varyヘッダについて

エッジキャッシュCDNではオリジンからのレスポンスヘッダに Vary:User-Agent が付与されている場合は、これらの値を削除しキャッシュ効率を高めています。

注釈

Varyヘッダは 「同じURLであってもVaryヘッダに指定されている内容が異なれば別のコンテンツとして取り扱いう」 というオリジンサーバーからの命令です。 たとえば、Vary: User-Agentというヘッダーをレスポンスヘッダに付与しておくとCDNはUser-Agentヘッダの内容に応じたキャッシュを保持します。 しかし、User-Agentはブラウザーのバージョンなどによって多数存在するためキャッシュ効率が非常に悪くなり、キャッシュヒット率の低下、オリジンサーバーの負荷が高まる恐れがあります。 ※Accept-Languageを指定いただいた場合は、クライアントのAccept-Language毎にキャッシュを生成します。

オリジンサーバーエラー時のレスポンス

オリジンサーバーとの通信時、以下の条件に当てはまる場合キャッシュサーバーはステータスコード500をレスポンスします。

  • オリジンドメインのDNSレコードが参照できなかった

  • オリジンドメインのDNSレコードが存在しなかった

  • オリジンドメインに割り当てられているDNSレコードが不正

  • オリジンとの通信が確立しなかった(初回TCP通信は10秒、TCP通信完了後CDNからの初回リクエスト30秒)

  • オリジンとの通信がキャッシュ前に途中で途切れた

  • 500 502 504エラーが発生した場合

  • オリジンとの通信で5系レスポンスが発生し且つ高負荷の場合

コンテンツ圧縮(Gzip/Brotli)

コンテンツ圧縮対応プランの場合、特定のコンテンツを対象にエッジ側で自動的に圧縮し、対応したクライアントに圧縮コンテンツを提供します。 圧縮コンテンツを提供する条件は以下の通りです。

コンテンツ圧縮条件

  • コンテンツ圧縮対応プランで、コンテンツ圧縮機能を有効にしていること。

  • リクエストヘッダーに Accept-Encoding: br, gzip いずれかが付与されている圧縮コンテンツ対応クライアントであること。

  • 弊社で定めた所定の圧縮対象コンテンツであること。

  • キャッシュ可能コンテンツであること。(TTLがゼロ以上またはカスタム設定によりキャッシュ除外設定を実施していないこと)

  • オリジンからのレスポンスヘッダーに Content-Length が含まれていること。

  • オリジンからのステータスコードが 200であること。

  • オリジンから Content-Encoding ヘッダがレスポンスされていないこと。

圧縮対象コンテンツ

以下のMimeTypesのコンテンツが圧縮対象となります。

  • "/xml"

  • "/json"

  • "text/*"

  • "/html"

  • "application/eot"

  • "application/x-otf"

  • "application/font"

  • "application/x-perl"

  • "application/font-sfnt"

  • "application/x-ttf"

  • "application/javascript"

  • "font/eot"

  • "font/ttf"

  • "application/opentype"

  • "font/otf"

  • "application/otf"

  • "font/opentype"

  • "application/pkcs7-mime"

  • "image/svg+xml"

  • "application/truetype"

  • "application/ttf"

  • "application/vnd.ms-fontobject"

  • "application/x-font-opentype"

  • "application/x-font-truetype"

  • "application/x-font-ttf"

  • "application/x-httpd-cgi"

  • "application/x-javascript"

  • "application/x-mpegurl"

  • "application/x-opentype"

圧縮コンテンツの優先順位

リクエストヘッダーに Accept-Encoding: br が含まれている場合、エッジキャッシュCDNはBrotli圧縮を優先します。 ヘッダーは正規化され、正規化された値がオリジンサーバーに Accept-Encoding ヘッダーとして送信されます。

br > gzip > deflate

brotli対応オリジンサーバーからのレスポンス時

エッジキャッシュCDNが、オリジンサーバーから Content-Encoding:br ヘッダーを受け取った場合、 既にキャッシュ済のコンテンツが存在していたとしても、別コンテンツとしてキャッシュに格納します。

警告

既に圧縮されていないコンテンツがキャッシュ済の場合、圧縮対応クライアントからリクエストがきても、既にキャッシュ済の未圧縮コンテンツを返却します。 キャッシュ削除、またはコンテンツがリフレッシュされた段階で、再度コンテンツ圧縮条件を参照しコンテンツの圧縮を試みます。

圧縮コンテンツの注意事項

Accept-Encodingヘッダーについて

Accept-Encoding ヘッダーが存在しない、または Accept-Encoding ヘッダー内に gzip br いずれも含まれない場合、 エッジキャッシュは、 Accept-Encoding ヘッダーを削除後オリジンに転送します。

ETAGヘッダー

ETAGが含まれているコンテンツを圧縮する時、HTTPレスポンスヘッダーを変更することがあります。ETAGが付与されたコンテンツを圧縮した場合、 エッジキャッシュは強いETAGから弱いETAGに変換し弱いETAGをレスポンスします。

条件付きリクエスト

エッジキャッシュCDNは有効期限切れになっているコンテンツに対するリクエストを受け取ると、 リクエストをオリジンサーバーに転送し最新のコンテンツ取得するか、 最新のコンテンツがすでに存在することをオリジンサーバーに確認します。

オリジンサーバーがETag または LastModified もしくはその両方の値をレスポンスしている場合、 エッジキャッシュCDNは次のどちらかまたは両方を追加しオリジンサーバーに転送します。

  • 有効期限切れコンテンツの ETag 値が含まれる If-Match または If-None-Match ヘッダー。

  • 有効期限切れコンテンツの LastModified 値が含まれる If-Modified-Since ヘッダー。

オリジンサーバーは、これらの情報を用いてコンテンツが更新されているかどうかを判別し、 最新コンテンツを返却するか、または HTTP 304 ステータスコード (変更なし) のみをレスポンスします。

CORS(Cross-Origin Resource Sharing)対応

エッジキャッシュCDNではオリジンサーバーのレスポンスヘッダ(Access-Control-Allow-Origin)を尊重してコンテンツと共にキャッシュし 呼び出し元に返却します。 そのため、CORSに対応させる場合はオリジンサーバーのレスポンスにAccess-Control-Allow-Originを含めて頂く必要が御座います。

CORSとは

注釈

あるドメインで実行されているWebアプリケーションが別のドメイン内にあるリソースにアクセスできるようにするHTTPの機能です。 クロスサイトスクリプティング攻撃の可能性を低減させるために、すべての最新の Web ブラウザーには * Same-Originポリシー と呼ばれるセキュリティ制限が実装されています。これにより、Web ページは他のドメイン内のリソースを呼び出すことができません。 CORSを使用すれば、外部ドメインのリソースを参照する事ができます。

Access-Control-Allow-Originヘッダ設定例

.htaccess:

<IfModule mod_headers.c>
<FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css|css)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>

Nginx:

location ~ \.(ttf|ttc|otf|eot|woff|font.css|css)$ {
         add_header Access-Control-Allow-Origin "*";
}

トラフィックスパイクの同時リクエスト

コンテンツを完全にキャッシュする間に、複数ユーザーから同時アクセスがあった場合、キャッシュ取得中のセッションを同時アクセスした全ユーザーに即時ストリーム配信し、 あらゆる状況下で配信待ちをゼロにする独自機能「インスタントストリーム」に対応しています。 インスタントストリームはオリジンサーバーへのアクセスは従来通り一度だけにとどめ、負荷を最小限にすると同時にCDN本来のメリットである高速配信を両立させます。

通常CDNは、オリジンサーバー負荷を軽減するため、コンテンツが完全にキャッシュされるまでの間に着信したリクエストを待ち状態にし、完全にキャッシュが完了してから一斉配信します。 そのため、完全にキャッシュするために時間を要するような数ギガバイトクラスの大容量ファイルの場合、キャッシュ期限切れが発生した際ダウンロード待ちが発生することを意味します。

インスタントストリーム制限事項

インスタントストリームにはいくつかの制限があります。

HTTP / 1.0クライアント

HTTP / 1.0のリクエストで、レスポンスヘッダーにContent-Lengthフィールドが含まれていない場合、インスタントストリームは無効となります。 コンテンツのキャッシュ取得中にHTTP / 1.0リクエストを着信すると、HTTP / 1.0リクエストはレスポンスヘッダーとレスポンスBodyを受信する前に、 コンテンツがダウンロードされるのを待機します。

Gzipとの互換性

CDNサービス側で自動的にGzip圧縮がおこなわれるコンテンツタイプについては、インスタントストリームは無効となります。

ESIとの互換性

ESIを介して処理されるレスポンスはインスタントストリームが無効となります。

オリジンクラスター

エッジキャッシュCDNは任意のオリジンサーバーを最大2つまで登録でき、以下のような制御を行うことができます。

注釈

オリジンクラスターを利用する場合は、いかなるケースでもオリジンサーバーの正常性を確認するための ヘルスチェック用URLをご用意いただく必要が御座います。

均等ロードバランシング

2台の登録されたオリジンサーバーに均等にHTTPリクエストを分散します。

プライマリー・セカンダリーオリジン

通常時はプライマリーオリジンを利用し、プライマリーオリジンのヘルスチェックに問題が発生した際は、 セカンダリーオリジンを利用します。プライマリーオリジンのヘルスチェックが正常に戻った場合は、 自動的にプライマリーオリジンからコンテンツを取得します。

取り消されたリクエスト

コンテンツがキャッシュになく、エッジキャッシュCDNがコンテンツをオリジンから取得中にクライアントがブラウザーを閉じる等をしてセッションを終了すると、 そのコンテンツをキャッシュせず破棄します。

オリジンサーバー応答タイムアウト

オリジンサーバーのタイムアウトは、以下の種類があります。

  • 最初のバイトを受信するまでの待機時間(5s)

  • オリジンサーバーへのコネクションタイムアウト (デフォルト10s)

  • それぞれの byte を取得するまでのタイムアウト(デフォルト150s)

  • オリジンのKeepAlive Timeout 60秒

注釈

タイムアウト時間をデフォルト値から変更することが可能です。 タイムアウト時ステータスコードは500または502がレスポンスされます。

カスタムエラーページ

オリジンサーバーとの通信において以下の条件に該当する場合、エラーページやメンテナンスページサーバーからコンテンツを取得し表示させることが出来ます。

  • エッジキャッシュCDNとオリジンサーバー間でタイムアウト

  • オリジンサーバーから5系レスポンスが返却

注釈

デフォルトではエッジキャッシュCDNで定められたエラーページがレスポンスされます。

オリジンサーバーとTCP接続中断時の動作

オリジンサーバーがコンテンツをレスポンスしている最中に、エッジキャッシュCDNとTCP接続が中断した場合、 オリジンサーバーが Content-Length ヘッダーをレスポンスに含めたかどうかによって以下の通り動作が異なります。

  • Content-Length ヘッダーあり – コンテンツをオリジンサーバーから取得した後、コンテンツをクライアントに返します。ただし、Content-Length ヘッダーの値がコンテンツのサイズに一致しない場合はコンテンツをキャッシュしません。

  • Transfer-Encoding: Chunked – コンテンツをオリジンサーバーから取得した後、コンテンツをクライアントに返します。ただし、チャンクレスポンスが完了していない場合はコンテンツをキャッシュしません。

  • Content-Length ヘッダーなし – コンテンツをキャッシュしますが、コンテンツが完全でない場合があります。Content-Length ヘッダーがない場合は、TCP 接続が誤って中断されたか、または故意に中断されたかを判断できません。

警告

Content-Length ヘッダーを追加して、エッジキャッシュCDNが不完全なコンテンツをキャッシュしないように HTTP サーバーを設定することをお勧めします。

転送エンコード

オリジンサーバーが Transfer-Encoding: chunked を返した場合、受け取ったコンテンツをクライアントに返し、そのオブジェクトをチャンク形式でキャッシュします。 クライアントがRange GETに必要なバイトを選択しリクエストすると、HTTPレスポンスコードが200から206に変更されます。 クライアントからキャッシュ済コンテンツの最大サイズを超える範囲のRangeヘッダーを受け取った場合、416 "Request Range Not を返却します。

GEO IPブロック

エッジキャッシュCDNはクライアントIPアドレスの国に基づいてアクセスをブロックすることができます。(デフォルト:無効)

指定可能国

ISO 3166 Country Codesで定義されている国

判定ロジック

X-Forwarded-forが存在する場合は先頭のIPアドレス X-Forwarded-forが存在しない場合はクライアントIPアドレス

ご注意事項

  • iOS 15以降の「iCloud プライベートリレー」機能を利用している場合、国外IPアドレスが割り当てられ意図しないユーザーがブロックされる可能性が御座います。

  • CDNサービスの全段に別のCDNやロードバランサーセキュリティ製品を導入すると、IPアドレス判定はベンダーが通知したIPを元に実施されます。

注釈

GEOIPデータベースの更新頻度は1週間に2回となります。