利用Cloudflare Workers和Node.js构建高效301重定向服务

张开发
2026/6/1 1:54:24 15 分钟阅读
利用Cloudflare Workers和Node.js构建高效301重定向服务
1. 为什么选择Cloudflare Workers做301重定向当你需要把旧网址流量引导到新站点时301永久重定向是最优雅的解决方案。传统做法是在服务器配置Nginx或Apache规则但这会带来两个痛点一是每次修改都要动服务器配置二是跳转速度受限于服务器地理位置。而Cloudflare Workers的边缘计算特性完美解决了这些问题。我去年帮客户迁移电商平台时就深有体会。原先用Nginx做的301跳转海外用户平均要300ms才能完成跳转。改用Workers后全球任意节点的跳转时间都稳定在50ms以内。这是因为Workers代码会在Cloudflare全球300多个边缘节点运行用户访问时自动匹配最近的节点。另一个巨大优势是零运维成本。不需要维护服务器不用担心流量激增导致宕机。有次客户做促销活动瞬时流量暴涨到平时10倍Workers依然稳如泰山。这种弹性扩展能力对中小团队特别友好。2. 5分钟快速搭建基础跳转服务2.1 准备工作首先确保你拥有Cloudflare账号免费版即可需要绑定的域名需托管在Cloudflare目标跳转地址比如新网站URL登录Cloudflare控制台左侧菜单找到Workers Pages。点击创建服务给服务起个易懂的名字如redirect-service。这时你会看到在线代码编辑器默认模板已经包含事件监听基础代码。2.2 核心跳转逻辑替换默认代码为以下内容// 定义跳转规则字典 const redirectMap { blog: https://new-site.com/blog, shop: https://store.new-site.com } async function handleRequest(request) { const url new URL(request.url) // 获取URL中第一个路径段 const path url.pathname.split(/)[1] const target redirectMap[path] if (target) { // 存在匹配规则时执行301跳转 return Response.redirect(target, 301) } // 无匹配规则时返回404 return new Response(Not Found, { status: 404 }) } addEventListener(fetch, event { event.respondWith(handleRequest(event.request)) })这段代码的精妙之处在于它的可扩展性。redirectMap对象就像个路由表要新增跳转规则只需往里面加键值对。比如要添加/about的跳转只需增加一行about: https://new-site.com/about-us3. 高级配置技巧3.1 自定义域名绑定基础版Worker只能通过workers.dev子域名访问要绑定自己的域名需要在Workers控制台进入触发器标签点击添加路由输入要绑定的域名格式如example.com/*到DNS设置页面确认解析记录有个坑我踩过绑定二级域名如sub.example.com时必须先在DNS里添加CNAME记录指向你的worker.你的账号.workers.dev否则会报522错误。这是因为Workers会在DNS解析前拦截请求。3.2 动态路径保留有时我们需要保留原始URL的路径结构。比如旧链接example.com/products/123要跳转到new-site.com/items/123可以这样改造代码const pathMappings { /products/: /items/ } async function handleRequest(request) { const url new URL(request.url) let target null // 检查路径前缀匹配 for (const [oldPath, newPath] of Object.entries(pathMappings)) { if (url.pathname.startsWith(oldPath)) { const restPath url.pathname.slice(oldPath.length) target https://new-site.com${newPath}${restPath} break } } if (target) { // 保留查询参数 if (url.search) target url.search return Response.redirect(target, 301) } return new Response(Not Found, { status: 404 }) }4. 性能优化实战4.1 边缘缓存策略默认情况下Worker每次请求都会执行代码。我们可以利用Cache API提升性能async function handleRequest(request) { const cacheKey new Request(request.url, request) const cache caches.default // 先检查缓存 let response await cache.match(cacheKey) if (response) return response // 处理跳转逻辑... response Response.redirect(target, 301) // 设置缓存有效期1小时 response.headers.append(Cache-Control, s-maxage3600) event.waitUntil(cache.put(cacheKey, response.clone())) return response }实测这个优化能让重复访问的跳转速度从50ms降到10ms以内。注意缓存时间不宜过长建议1-24小时方便后续规则调整能及时生效。4.2 智能流量分配AB测试场景下可以用Workers实现按比例分流const variants [ { url: https://new-site.com, weight: 70 }, { url: https://beta.new-site.com, weight: 30 } ] async function handleRequest(request) { const random Math.random() * 100 let accumulatedWeight 0 let target variants[0].url for (const variant of variants) { accumulatedWeight variant.weight if (random accumulatedWeight) { target variant.url break } } return Response.redirect(target, 302) // 临时跳转用302 }这个方案比传统Nginx配置灵活得多可以随时在Worker代码里调整分流比例无需重启服务。我在某次大促时就用它逐步将流量从旧系统迁移到新系统全程零故障。

更多文章