基于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对象是只读的,且响应流只能被消费一次,直接修改会导致报错
测试方式:
- 把脚本复制到Cloudflare Workers控制台,替换
PRELOAD_HEADERS里的资源路径为你实际的文件路径 - 部署后用浏览器隐私模式访问站点,查看响应头,能看到添加的Link Headers和
Set-Cookie - 关闭隐私模式再次访问,就不会再出现这些新增的Headers了
内容的提问来源于stack exchange,提问作者Vila




