You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloudflare缓存配置:实现/page/X类URL共享缓存(忽略页码)

问题背景

我的网站有大量形如/page/1、/page/2、/page/3的页面,这些页面的JS代码完全一致,仅通过检测URL加载对应/json/1.json、/json/2.json等JSON文件。当前若对[/page/*]配置Cache Everything规则,缓存为空时,用户访问3个不同页码的页面会触发3次源站请求,仅二次访问才会命中缓存。我希望忽略URL中的页码,让用户访问/page/1后再访问/page/2时,仅/page/1触发源站请求,/page/2直接命中CDN缓存。出于SEO考虑,需使用路径式URL(/page/1)而非查询字符串式(/page/?page=1),请问能否通过Page Rules、缓存规则或Workers实现该需求?若可以,具体该如何配置?

解决方案

一、通过Page Rules实现

  • 新建Page Rule,匹配路径设置为/page/*
  • 开启「Cache Everything」选项
  • 找到「Cache Key Query String」设置,选择「Custom」,输入框填写/page/(将缓存键固定为该路径,忽略后续页码)
  • 根据业务需求设置合适的缓存TTL(例如1天)

二、通过缓存规则(Cache Rules)实现

  • 进入Cloudflare「缓存」-「缓存规则」页面,新建规则
  • 匹配条件:选择「路径」-「匹配」-「包含」,值填写/page/
  • 缓存设置:开启「缓存所有内容」
  • 缓存键设置:选择「自定义缓存键」,在「路径」选项中选「替换为」,输入固定路径/page/,使所有页码页面共用同一缓存键
  • 设置缓存TTL后保存规则

三、通过Workers实现(灵活定制场景)

如果需要更灵活的逻辑,可通过Workers改写缓存键:

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

async function handleRequest(request) {
  const url = new URL(request.url)
  // 匹配/page/数字格式的路径
  if (url.pathname.match(/^\/page\/\d+$/)) {
    // 构造统一的缓存键路径
    const cacheKeyUrl = new URL('/page/', request.url)
    const cacheRequest = new Request(cacheKeyUrl, request)
    
    // 尝试从缓存获取响应
    let response = await caches.default.match(cacheRequest)
    if (!response) {
      // 缓存未命中时请求源站
      response = await fetch(cacheRequest)
      // 设置缓存规则并存储
      response = new Response(response.body, response)
      response.headers.set('Cache-Control', 'public, max-age=86400')
      await caches.default.put(cacheRequest, response.clone())
    }
    return response
  }
  // 非目标路径直接转发请求
  return fetch(request)
}
  • 将代码部署到Cloudflare Workers,设置Worker路由为你的域名.com/page/*
  • 确保源站能响应/page/路径的请求(若源站无此路径,可调整逻辑为保留基础路径结构,仅忽略页码部分)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:28:30