jwtを利用したサービスでログイン時にfastlyのcacheを有効にする

ログインユーザーにもcacheを効かせたいときがある. その時はjwt tokenの値を利用してcacheを作れば良い. jwt tokenの名前を jwt_token しよう. まずjwt tokenから値を抜き出す. sub vcl_recv { if (req.http.Cookie ~ "jwt_token=.*") { set req.http.X-TOKEN = regsub(re.group.0, "\;.*", ""); } } 次にcacheのkeyとなるhashを生成する. sub vcl_hash { if (req.http.X-TOKEN) { set req.hash += req.http.X-TOKEN; } set req.hash += req.url; } これでjwt tokenを利用してcacheが作られます. ちなみにログインのたびにjwt tokenは変わるのでログインごとにcacheが破棄されるような挙動になる.

5月 16, 2019

fastlyでVary headerをきれいにする

Vary header の内容が冗長性のあるときがある. 例えばこんな感じ Vary: User-Agent, Accept-Encoding, User-Agent とか. こういうのを Vary: User-Agent, Accept-Encoding か Vary: Accept-Encoding, User-Agent したい. かぶってるのを消して追加してしまえば良い. sub vcl_fetch { if (beresp.http.Vary ~ ".*User-Agent.*User-Agent.*") { set beresp.http.Vary = regsuball(beresp.http.Vary, "(,\s*)?User-Agent", ""); set beresp.http.Vary = regsuball(beresp.http.Vary, "^(\s)?(,(\s+)?)+", ""); } if (bresp.http.Vary ~ "^(\s)*$") { set bresp.http.Vary = "User-Agent"; } else { set bresp.http.Vary = bresp.http.Vary + ", User-Agent"; } }

5月 15, 2019