上周市场部的小李跑来找我,说他们要发一批短信,里面得放链接,问我公司有没有短链接工具。我说有啊,花钱买的那种一年好几千。他脸都绿了。
我说你别急,我给你搭一个,十分钟的事,不花钱。
先说人话:这俩东西到底是啥
Cloudflare Workers,你就理解成「云上门卫」。用户敲一下门(访问短链),门卫立刻翻登记本,告诉你该去哪个房间(跳转到原始长链接)。整个过程几毫秒,用户根本感觉不到。
KV 存储,就是那本登记本。Cloudflare 在全球几百个机房各放了一本,用户在哪个城市,就近读哪本,快得很。
免费额度给你划一下:Workers 每天 10 万次请求,KV 每天 10 万次读、1000 次写、1GB 存储。中小企业的短链需求,用到天荒地老都用不完。
动手三步
第一步,建一本登记本。 在 Cloudflare 后台点 Workers & Pages → KV,新建一个命名空间,名字随便叫,比如 LINKS。
第二步,写门卫的操作规程。 建一个 Worker,代码大概长这样:
export default {
async fetch(request, env) {
const code = new URL(request.url).pathname.slice(1);
if (!code) return new Response('ok');
const target = await env.LINKS.get(code);
if (!target) return new Response('404', { status: 404 });
// 顺手记一笔
const day = new Date().toISOString().slice(0, 10);
const key = `stat:${code}:${day}`;
const n = parseInt(await env.LINKS.get(key) || '0');
await env.LINKS.put(key, String(n + 1));
return Response.redirect(target, 302);
}
}
这段就是完整的短链服务了。门卫查本子、指路、然后在另一个本子上划一道「正」字。
第三步,绑个域名。 在你自己的域名下加一条解析,指向这个 Worker,比如 s.你的公司.com。以后 s.公司.com/abc123 就是短链。
两个坑,我踩过
坑一:跳转用 302,别用 301。 301 是永久跳转,浏览器会缓存,用户第二次点压根不经过你的门卫,统计数据就丢了。302 每次都会问一遍门卫,统计才准。
坑二:KV 不是数据库。 它是「最终一致性」——你在北京写进去,上海那边可能得过几十秒才能读到。而且同一秒来 100 个请求,计数器可能丢数。短链本身没问题(写一次读一万次),但**精确统计