Cache-Controlヘッダのstale-while-revalidateとは

20170215追記「Nginxがstale-while-revalidateに対応した」
http://d.hatena.ne.jp/ASnoKaze/20170211/1486820792


Chromeの「chrome://flags/」に「stale-while-revalidate キャッシュ指令を有効にする」と言うフラグがあったので、簡単に調べた。 「RFC5861 HTTP Cache-Control Extensions for Stale Content」で定義されており、HTTPにおけるキャッシュ制御の拡張として「stale-while-revalidate」と「stale-if-error」が定義されている。

stale-while-revalidate

stale-while-revalidateはCache-Controlヘッダに付加される。
Cache-Control: max-age=600, stale-while-revalidate=30
max-age(秒)の間はサーバに問い合わせること無くキャシュを使用する。 stale-while-revalidateが指定されている場合は、max-age(秒)が経過した後、そこからstale-while-revalidate(秒)で指定された期間はHTTPリクエストが発生するとまずキャッシュを使用し、非同期的にバックグラウンドでリソースが更新されているかをサーバに問い合わせる。これにより、サーバ側でリソースの更新があった場合でもタイムラグが発生せずブラウザはキャッシュを更新することが出来る。

stale-if-error

stale-if-errorはCache-Controlヘッダに付加される。
Cache-Control: max-age=600, stale-if-error=1200
stale-if-errorが指定されている場合は、max-age(秒)が経過した後、そこからstale-if-error(秒)で指定された期間はHTTPリクエストに失敗するとキャッシュを使用することが出来る。 例えば、上記「max-age=600, stale-if-error=1200」を受け取ってから900秒経過した後にHTTPリクエストを送信した場合 レスポンスとしてエラーを示すメッセージを受け取る
HTTP/1.1 500 Internal Server Error
Content-Type: text/plain
キャッシュから以下のようにリソースを取得される
HTTP/1.1 200 OK
Cache-Control: max-age=600, stale-if-error=1200
Age: 900