短链服务怎么设计:302 跳转、过期策略与短信点击追踪
带链接短信的下游工程:三条约束(域名可自定义、链接逐条报备、不支持动态)推导出的短链服务形态,报备状态机与filing_no硬闸,短链服务四要点(302跳转、过期策略、短码防遍历、峰值扛量),送达回执与点击统计的区别与四层漏斗,以及域名被屏蔽、落地页变更、验证码不带链接三个坑。
链接报备、签名重算这些「怎么发」的问题,上一篇讲完了。这篇讲下游:链接批准之后,承载它的那套短链服务该怎么设计,点击数据从哪来。
因为域名可自定义、链接必须报备具体内容、不支持动态链接——这三条约束决定了短链服务的形态。
一、三条约束,三条推论
| 约束 | 直接后果 | 工程推论 |
|---|
| 域名支持自定义,可用短域名 | 你可以用自己的短链域名,不必用通道方的长域名 | 短链服务自己掌控(或用自建短链),跳转规则、过期、统计都在你手里 |
|---|---|---|
| 链接需要报备具体内容 | 报备是逐条的,不是"我有个链接功能"就完事 | 报备与发送必须绑定成一个流程,报备状态要落库、要可查 |
| 不支持动态链接 | 发送时不能拼接 ?user=xxx&act=yyy | 活动参数必须在报备之前就固化,发送时只能用已报备的静态链接 |
第三条最关键:"不支持动态"意味着你不能在发送那一刻决定链接内容。
举例:双十一活动,你要给 10 万人发带个人追踪参数的链接 https://s.example.com/a?u=88231。这条路走不通——每个用户的链接都不同,每个都要报备。可行做法只有两类:
https://s.example.com/double11,落地页用手机号/券码识别身份两条路的取舍是:个性化程度 vs 报备工作量。通常选第 1 条。
二、报备驱动的发送流程
因为链接要逐条报备,流程的主干是报备状态机,不是发送接口:
① 生成短链 → ② 落库(目标URL、短码、有效期)→ ③ 提交报备(签名+模板+具体链接)
→ ④ 审核通过 → ⑤ 纳入发送计划 → ⑥ 批量发送 → ⑦ 送达回执入库 ↓ 驳回 → 修正后重新报备(回到 ③)
三个必须落实的工程动作:
1. 短链与报备记录绑定
CREATE TABLE sms_link (
link_id TEXT PRIMARY KEY, short_code TEXT NOT NULL UNIQUE, -- 短域名下的短码 target_url TEXT NOT NULL, -- 报备的原始链接 template_id TEXT NOT NULL, -- 关联的报备模板 filing_no TEXT, -- 报备编号/状态 status TEXT NOT NULL, -- draft / filed / approved / rejected / sent expire_at TIMESTAMP, created_at TIMESTAMP );
没有 filing_no 就不允许进入发送计划——这是防止"链接还没报备就发出去"的唯一硬闸。这类错误在联调期最容易发生,因为发送接口本身不会校验链接报备状态(它只校验签名和模板)。
2. 报备周期要排在活动排期前面
报备有审核周期,而活动上线时间是业务定的。两者必须在排期时对齐:先确认链接能报备通过,再定活动发码时间,不能反过来。实践中最常见的失误是活动前一天才提交链接报备,导致发送窗口被压掉。
3. 每次发送记录用的是哪条链接
发送批次 → link_id 的映射必须持久化。否则事后排查"这批用户点的是哪个链接"时,只能靠时间戳猜。
三、短链服务的四个要点
既然域名可自定义,短链基础设施就归你自己管:
1. 用 302 还是 301
2. 过期策略
不支持动态链接的另一个含义是:链接一旦发出就无法收回。所以每个链接都要有明确的失效时间,过期返回自己的提示页(而不是 404 或跳到首页)。失效时间要与报备时提交的链接描述保持一致,避免报备内容与实际行为不符。
3. 短码生成要防碰撞、防遍历
自增短码(/a1、/a2)会被批量遍历,既不安全也不好看。用随机短码或哈希截断,长度按量级定(百万级链接通常 6-8 位)。
4. 跳转层要能扛住突发
短信是瞬时到达的:一批 10 万条发出去,点击会在几分钟内集中到达。跳转服务要按峰值设计,而不是按平均值。这和批量调用接口是同一个道理(见并发与限流的工程做法)。
四、点击统计:送达回执 ≠ 点击
这是个必须分清的两件事:
| 来源 | 回答的问题 |
|---|
| 送达回执 | 通道返回 | 短信有没有到用户手机上 |
|---|---|---|
| 点击统计 | 你的落地页/跳转服务 | 用户有没有点开链接 |
通道提供的是送达回执(我们这条通道支持实时状态回调)。点击统计必须自己在跳转层或落地页做——用短链的跳转记录,或落地页埋 UTM。
顺带一个容易踩的误区:只看送达回执就报"效果不错"。送达只说明短信到了手机,没点开的短信等于零触达。评估营销短信要看漏斗:
发送 → 送达 → 点击 → 落地页转化
每一层的丢失原因不同(内容被拦截、链接没报备通过、落地页太慢),把四层数据分开看,才能定位问题在哪一环。营销短信的内容与投诉风险见营销短信合规指南。
五、三个真实会遇到的坑
1. 短链域名被拦截或屏蔽
运营商与终端安全软件会识别短链域名。域名要稳定、要有备案、不要频繁更换——一旦某个域名被标记,换域名意味着之前报备过的链接全部作废,重新报备一轮。
2. 报备的是链接,审核看的是内容
链接的落地页内容必须与报备时描述一致。活动落地页临时改成别的内容(比如从活动页换成促销页),可能被判定为与报备内容不一致。落地页改动要走和报备同样的流程管理,不能"页面随时改,链接不变"。
3. 验证码场景不建议带链接
验证码短信的用户心智是"快速拿到数字",带链接会分散注意力并拉低通过率;而且验证码内容与链接的模板是两套报备。真需要引导,用落地页的自然入口更合适——验证码本身的发送与防刷见短信验证码防刷实战。
六、上线检查单
□ 短链域名已备案、稳定,计划长期使用
□ 短链服务用 302,带过期时间与自定义失效页 □ 短码随机生成,防碰撞防遍历 □ link 表有 filing_no 字段,未报备通过的链接无法进入发送计划 □ 报备提交的是"签名+模板+具体链接",链接与模板绑定 □ 活动排期先定报备完成时间,再定发码时间 □ 落地页内容与报备描述一致,改动走同样流程 □ 每批发送记录 link_id,可回溯 □ 漏斗分层统计:发送/送达/点击/转化 分开看 □ 验证码短信默认不带链接
相关阅读
短信通道按条计费,签名与模板(含链接)需报备,具体配额与价格与商务确认;新用户有免费试用额度可用于联调。