【问题标题】:CloudFlare Workers - Check for Cookie, Add Headers, Set CookieCloudFlare Workers - 检查 Cookie、添加标头、设置 Cookie
【发布时间】:2018-08-31 21:33:01
【问题描述】:

我只想通过CloudFlare workers 为首次访问者动态添加http-headers。例如这些标题:

Link: </path/to/file.css>; rel=preload; as=style; nopush
Link: </path/to/script.js>; rel=preload; as=script; nopush

所以,我需要的是以下内容,通过 JavaScript,在 CloudFlare Workers 中:

  1. 检查客户端是否存在特定的cookie。
  2. 如果 cookie 不存在,请添加 http-headers,然后设置该特定 cookie。
  3. 如果 cookie 确实存在,则什么也不做。

您可以使用代码here

这是来自 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
})

【问题讨论】:

  • 没有人对此有意见,有点令人失望。

标签: javascript cookies http-headers cloudflare cloudflare-workers


【解决方案1】:

我已经设法修改了工作人员并提供了一个解决方案,如果用户在网站上发表了评论,则删除 Cache-Control 标头。

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

async function addHeaders(request) {
    // Forward request to origin, get response.
    let response = await fetch(request)

    if (response.headers.has("Content-Type") && 
        !response.headers.get("Content-Type").includes("text/html")) {
        // File is not text/html. Pass request through.
        return fetch(request)
    }

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

    // Check for cookie.
    let cookies = request.headers.get('Cookie') || ""
    if (cookies.includes("returning=true")) {

        if (cookies.includes("comment_") && response.headers.has("Cache-Control")) {
            // User has commented. Delete "cache-control" header.
            response.headers.delete("Cache-Control")

            // Return on to client.
            return response
        }

        // User has been here before but has not commented.
        // Just pass request through.
        return fetch(request)
    }

    // Add headers.
    response.headers.set("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
}

但是,如果您尝试删除最初由 Cloudflare 设置的标头(在本例中为 Cache-Control),您将遇到未知错误 1101,这将使您的网站无法访问。您也不能修改 Cloudflare 设置的标头。显然,您只能操作按原点设置的标头并最终添加新标头。

【讨论】:

    【解决方案2】:

    这是一个 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
    }
    

    【讨论】:

    • 像魅力一样工作。我还有一个问题:假设 WordPress 网站有这个标题 cache-control: public, max-age=1800。修改上述工作脚本,以便在存在以下 cookie 时删除此标头wp-.*|wordpress.*|comment_.*,这意味着当用户登录和/或在网站上发表评论时。请注意星号,它们不是完整的 cookie 名称。此规则也只需要应用于 html 页面。我不希望为静态资源(图像、css、脚本等)剥离缓存控制标头。
    • 当我说“修改”脚本时,我的意思是在脚本中添加这个新条件。
    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 2020-08-16
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多