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);
}