@ka2n

Technology and beer

CloudFlare Workersを使って無料プランでも無理矢理キャッシュの出し分けを実現する

originのVaryヘッダーを元にキャッシュを制御するべきだけど、あらかじめキャッシュを分けたい条件が判別できるなら、以下の方法でURLを書き換えてしまえばOK.

import { createHash } from 'crypto'

export async function handleRequest(request: Request): Promise<Response> {
  const vary = request.headers.get('accept-language') || ''
  const varyHash = createHash('md5')
    .update(vary)
    .digest('hex')
  
  let url = new URL(request.url)
  url.searchParams.append('_vary', varyHash)
  request = new Request(url.toString(), request as RequestInit)

  return fetch(request, {
    cf: {
      cacheEverything: true,
    }
  })
}

まさに貧者のCDN