VaryヘッダがあるとSquidがキャッシュから取り出さない

今日はちょっと呪文的なお話。
こんな構成になっているWebサーバがあります。

Apache(1)->Plone

Ploneが返してくるページの一部がちょっと複雑でレスポンスが悪いのでApachePloneの間にSquidかまして、その一部のページだけをキャッシュしてやることにしました。

Apache(1)->Squid->Plone

ところが全然キャッシュしてくれません。Squidのログを参照するとTCP_MISS/200ばかりを返してくる。debug_optionを最高レベルにして丹念にしらべるとどうもキャッシュストアはしているけれども次回のリクエストでキャッシュから取り出してくれないみたい。

レスポンスヘッダはこんな。

Cache-Control:private
Content-Encoding:gzip
Content-Language:ja
Content-Length:6904
Content-Type:text/html;charset=utf-8
Date:Fri, 31 May 2013 07:21:36 GMT
Expires:Sat, 1 Jan 2000 00:00:00 GMT
Server:Zope/(Zope 2.10.13-final, python 2.4.6, linux2) ZServer/1.1 Plone/3.3.6
Vary:Accept-Encoding

Expiresがよくないな。そりゃキャッシュしないよ。ということでPloneでヘッダコントロールすりゃいいんですが、正直良くわからない(笑)ので途中にもう一発Apacheをかませてmod_headerでコントロール

構成をこうして、

Apache(1)->Squid->Apache(2)->Plone

で、Apache(2)のバーチャルホストでこんな設定。

    <LocationMatch /destination_location>
           Header unset Expires
    </LocationMatch>

これで実験、しかしこれでもキャッシュしてくれない。うーんなぜだ。
うーん、Cache-Controlも消してみる?

    <LocationMatch /destination_location>
           Header unset Expires
           Header unset Cache-Control
    </LocationMatch>

これでもだめ。あとなんだろ。Vary? 関係ないよなぁ。

    <LocationMatch /destination_location>
           Header unset Expires
           Header unset Cache-Control
          Header unset Vary
   </LocationMatch>

をを、キャッシュヒット。

127.0.0.1 - - [31/May/2013:16:22:40 +0900] "GET http://127.0.0.1:3128/hogefuga/hoge HTTP/1.1" 200 7278 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36" TCP_MEM_HIT:HIER_NONE

最終的にはこうなりました。

    <LocationMatch /hogehoge/cms/country>
        Header unset Vary
        Header unset Expires
    </LocationMatch>

でVaryヘッダってなに

ここによると、こう。

http の Vary レスポンスヘッダはコンテント・ネゴシエーションの基準を UserAgent に通知するために使う。

いやぁ、キャッシュコントロールになんにも関係なさそうだけど。
よくわからないので、まぁこれは呪文ですね。目的が達成できればそれでいいのだ。