varnish でuser-agent(のグループ) ごとにキャッシュする

これメモってた気がするんだけど、検索してもひっかからなかったし
だいぶ更新放置しているので久々に書く。


同一URLでもアプリケーションによってPC/スマートフォン/ガラケー などでコンテンツを変えている場合、それぞれ場合分けごとにキャッシュをしないといけない。

vcl_hashのdefaultはこれ

sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return (hash);
}	

ここで単純にhash_data(req.http.User-Agent); を追加してしまうと大量のuser-agentごとにキャッシュするのでだいぶ効率が悪い。公式のドキュメントの通り、新規の変数(X-UA-Device) を作って、user-agentごとにグループ分けをして、その変数をhash_dataに追加する。

vcl_recv {
  if (req.http.User-Agent ~ "(?i)(iPhone|Android)") {
    set req.http.X-UA-Device = "sp";
  } 
  else if (req.http.User-Agent ~ "(?i)(docomo|kddi|up\.browser|j-phone|softbank|vodafone|mot-)") {
    set req.http.X-UA-Device = "mobile";
  } 
  else {
    set req.http.X-UA-Device = "pc";
  }
  # 略
}
	
sub vcl_hash {
  hash_data(req.url);
  ## これ追加
  hash_data(req.http.X-UA-Device);
  if (req.http.host) {
    hash_data(req.http.host);
  } else {
    hash_data(server.ip);
  }
  return (hash);
}