You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于CloudFlare Workers实现首次访客动态添加HTTP Headers

实现首次访客动态添加指定HTTP Headers的Cloudflare Workers脚本

刚好之前做过类似的需求,给你写了一个完整可用的Workers脚本,完美匹配你要的逻辑——只给第一次访问的访客添加预加载Header,之后就不再做任何处理了。

先上代码,后面再拆解关键细节:

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

async function handleRequest(request) {
  // 自定义标记访客已访问的Cookie名称
  const COOKIE_NAME = 'first_visit_mark'
  // 定义需要添加的预加载Link Headers,可按需增减
  const PRELOAD_HEADERS = [
    '</path/to/file.css>; rel=preload; as=style; nopush',
    '</path/to/script.js>; rel=preload; as=script; nopush'
  ]

  // 检查请求中是否存在标记Cookie
  const hasVisited = request.headers.get('Cookie')?.includes(`${COOKIE_NAME}=1`)

  // 获取原始站点响应
  let response = await fetch(request)

  // 首次访问时修改响应
  if (!hasVisited) {
    // 克隆响应(响应流只能被读取一次,必须克隆后才能修改)
    response = new Response(response.body, response)
    
    // 批量添加预加载Link Headers
    PRELOAD_HEADERS.forEach(headerValue => {
      response.headers.append('Link', headerValue)
    })

    // 设置标记Cookie,这里设为30天过期,可自行调整有效期
    const cookieExpiry = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toUTCString()
    response.headers.append(
      'Set-Cookie', 
      `${COOKIE_NAME}=1; Expires=${cookieExpiry}; Path=/; HttpOnly; Secure; SameSite=Lax`
    )
  }

  return response
}

关键细节说明:

  • Cookie安全配置:我给Cookie加了HttpOnly(防止前端JS读取,降低XSS风险)、Secure(仅在HTTPS下发送,站点用HTTP的话可以去掉)、SameSite=Lax(减少CSRF风险),你可以根据自己站点的情况调整这些参数
  • 预加载Header处理:用append而不是set来添加Link Header,是为了不覆盖站点原本可能存在的其他Link Header
  • 响应克隆:必须克隆原始响应再修改,因为原生Response对象是只读的,且响应流只能被消费一次,直接修改会导致报错

测试方式:

  1. 把脚本复制到Cloudflare Workers控制台,替换PRELOAD_HEADERS里的资源路径为你实际的文件路径
  2. 部署后用浏览器隐私模式访问站点,查看响应头,能看到添加的Link Headers和Set-Cookie
  3. 关闭隐私模式再次访问,就不会再出现这些新增的Headers了

内容的提问来源于stack exchange,提问作者Vila

火山引擎 最新活动