CloudFlare Workers-检查Cookie,添加标题,设置Cookie

Vil*_*ila 4 javascript cookies http-headers cloudflare cloudflare-workers

我想仅通过首次访问者通过CloudFlare工作者动态添加http-header 。例如,这些标头:

Link: </path/to/file.css>; rel=preload; as=style; nopush
Link: </path/to/script.js>; rel=preload; as=script; nopush
Run Code Online (Sandbox Code Playgroud)

因此,我需要通过CloudFlare Workers中的JavaScript进行以下操作:

  1. 检查客户端是否存在特定的cookie。
  2. 如果该cookie不存在,请添加http-headers,然后设置该特定cookie。
  3. 如果cookie存在,则不执行任何操作。

您可以在此处使用代码。

这是CF博客中的一个一般示例(涉及cookie和标头):

// A Service Worker which skips cache if the request contains
// a cookie.
addEventListener('fetch', event => {
  let request = event.request
  if (request.headers.has('Cookie')) {
    // Cookie present. Add Cache-Control: no-cache.
    let newHeaders = new Headers(request.headers)
    newHeaders.set('Cache-Control', 'no-cache')
    event.respondWith(fetch(request, {headers: newHeaders}))
  }

  // Use default behavior.
  return
})
Run Code Online (Sandbox Code Playgroud)

Ken*_*rda 9

这是一个实现您所描述内容的Cloudflare Worker:

addEventListener('fetch', event => {
  event.respondWith(handle(event.request))
})

async function handle(request) {
  // Check for cookie.
  let cookies = request.headers.get('Cookie') || ""
  if (cookies.includes("returning=true")) {
    // User has been here before. Just pass request through.
    return fetch(request)
  }

  // Forward request to origin, get response.
  let response = await fetch(request)

  // Copy Response object so that we can edit headers.
  response = new Response(response.body, response)

  // Add headers.
  response.headers.append("Link",
      "</path/to/file.css>; rel=preload; as=style; nopush")
  response.headers.append("Link",
      "</path/to/script.js>; rel=preload; as=script; nopush")

  // Set cookie so that we don't add the headers
  // next time.
  response.headers.set("Set-Cookie", "returning=true")

  // Return on to client.
  return response
}
Run Code Online (Sandbox Code Playgroud)