Varyヘッダについてメモ

ここ最近キャッシュコントロールのヘッダについて研究中。というよりキャッシュってどうやって見つけるんだろうってことでお勉強、実験中です。
Varyヘッダの働きかたについてちょっと誤解していたので忘れないうちにメモ。
Squidの文書によると、2.6あたりからVaryとEtagの両ヘッダをサポートしたとのこと。
で、その文書にはいままでURIだけをキーにしてキャッシュを作成していたが、VaryとEtagのサポートに伴い、これらヘッダ値+URImd5ハッシュを作成してそれをキーにしたと。store.logに残るのがそのmd5値。store.logの5カラム目ですね。

1444184896.876 SWAPOUT 00 0000B6C0 D05226074A35B354673E44DE98357310  200 1444184891        -1        -1 text/html 143485/143485 GET http://127.0.0.1:3128/hoge/fuga/

でですね、そうするとVaryヘッダをつけてキャッシュを生成した場合と、Varyヘッダなしでキャッシュを生成した場合だと違うキャッシュになるはず。ってことで実験してみたんですが、そうはならなかったんです。

こんな感じで実験

手順はこんな感じ。
1. User-Agentに"iphone"が含まれている場合はVaryヘッダにUser-Agentをつけてレスポンスするように設定。

<If "%{HTTP_USER_AGENT} =~ /iphone/i" >
  Header add Vary User-Agent
</If>

2. 上記条件でリクエスト(iphoneからリクエスト)。当然Squidにキャッシュされる。
3. もう一度iphoneからリクエスト。キャッシュヒットする。レスポンスはVary付き。
3. 1.の条件にマッチしない条件でリクエスト(例えばPCから)。別のキャッシュが生成される。2.のキャッシュはヒットしない。
4. もう一度2.の条件でリクエスト(iphoneからリクエスト)。そうすると、3.で生成されたキャッシュがヒットする。

どういうこと?

うーん、上記の4が予想外。でもこういうことだと思う。

  1. Varyヘッダ付きで生成されたキャッシュならば、Varyで指定されたヘッダ値+URIでキャッシュをマッチさせる。
  2. Varyヘッダがついていないキャッシュならば、URIのみでキャッシュマッチさせる。

以外と面倒なことやってるんだな。ってことで、少なくとも同一URIならばVaryやEtagをつけたり付けなかったりすると面倒ことになるってことで。