Cloudflare Workers 在使用反代、边缘请求处理时,常常会带来很高的延迟,并且请求数每天只有1M。而Snippets是Cloudflare推出的位于规则引擎级别的更轻量的边缘js服务,对于无需使用Worker全栈功能的用户来讲,他能够提供无限的请求数,延迟更低,更适合反代、边缘请求处理的业务。
这个功能类似阿里云的EdgeScript和腾讯的EdgeFunction,理论上之间的脚本都是可以互相修改适配的。
怎么开通
目前Snippets只对少部分域名后缀的大部分域名的Free计划提供5个配额,其他不支持的后缀可能需要等待后续跟进或开通Pro套餐。
目前已知可以获取Snippets的后缀有.top .net .xyz .org .me .cc .com
具体是否支持可以自行在Cloudflare进入一个域名,点击规则->Snippets,若出现需要升级计划则是不支持。
反代脚本
这个脚本是修改yutian81大佬编写的Worker反代pages脚本
Worker版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) })
async function handleRequest(request) { const targetBase = 'https://your.pages.dev'
if (request.headers.get('Upgrade') === 'websocket') { return fetch(request) }
const url = new URL(request.url) const newUrl = new URL(url.pathname + url.search, targetBase) const newHeaders = new Headers(request.headers) newHeaders.set('Host', newUrl.hostname) const newRequest = new Request(newUrl, { method: request.method, headers: newHeaders, body: request.body, redirect: 'manual' })
const response = await fetch(newRequest) if ([301, 302, 303, 307, 308].includes(response.status)) { const location = response.headers.get('Location') if (location && location.includes(targetBase)) { return Response.redirect( location.replace(targetBase, `https://${url.hostname}`), response.status ) } } return response }
|
Snippets 版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| export default { async fetch(request) { try { return await handleRequest(request); } catch (e) { return new Response(e.message || "Internal Error", { status: 500 }); } }, };
async function handleRequest(request) { const targetBase = 'https://your.pages.dev'
if (request.headers.get('Upgrade') === 'websocket') { return fetch(request) }
const url = new URL(request.url) const newUrl = new URL(url.pathname + url.search, targetBase) const newHeaders = new Headers(request.headers) newHeaders.set('Host', newUrl.hostname) const newRequest = new Request(newUrl, { method: request.method, headers: newHeaders, body: request.body, redirect: 'manual' })
const response = await fetch(newRequest) if ([301, 302, 303, 307, 308].includes(response.status)) { const location = response.headers.get('Location') if (location && location.includes(targetBase)) { return Response.redirect( location.replace(targetBase, `https://${url.hostname}`), response.status ) } } return response }
|
替换掉其中的targetBase到你的目标地址。
使用教程
在Cloudflare进入一个支持Snippets的域名,点击规则->Snippets,点击创建片段。

复制上方Snippets版本脚本,粘贴在左边,修改targetBase地址:

填写片段名称后,点击部署,在右侧选择自定义筛选表达式,具体匹配规则如图,值按照这个格式填写你的域名:https://访问域名/*,点击完成。

如果出现了此规则可能不适用于您的流量,说明你的访问域名可能已经正在使用,且没有开启Cloudflare小黄云。如果你使用的是优选域名则可以忽略这条消息直接选择部署,如果不是就选择创建新代理 DNS 记录,随便填写一个地址,后续再修改。
你可以按照这个教程部署优选域名,直接使用指向当前域名区域的优选域名,或者关闭小黄云直接在Cloudflare使用优选(不推荐,目前可用但以后可能会被禁止访问)。
规则会马上生效,你可以自行访问尝试是否可用。
关于更多Snippets的具体介绍可以参考Cloudflare文档:https://developers.cloudflare.com/rules/snippets/