URL 缩短看起来像给长链接做了减法,但真正变短的通常不是原始网址本身,而是用户需要复制、发送、扫码的那一小段字符。以 https://short.ly/3d7 这类地址为例,浏览器收到的其实只有几个字母和数字。服务端的实际工作,是查询这段短码背后对应哪一条长链接;查到之后,再把用户送到目标页面。换句话说,短链接的核心不是“压缩网址”,而是建立映射关系,再借助重定向完成跳转。

当用户提交一个原始网址时,系统通常会先做一些基础校验,比如协议是否合法、字符串能否正常解析、目标地址是否为空。校验通过后,就要生成一个唯一标识。短链接一般由固定域名和短码组成,域名部分负责标识服务,短码部分负责定位具体链接。短码可以用随机字符串,也可以由算法生成。常见做法包括 Base62 编码、哈希算法,以及一些较少用于普通 URL 缩短的编码方式。
自增 ID 是一种很经典的方案。可以把它理解为数据库给每条长链接发一个排队号码,第一次是 1,第二次是 2,第三次是 3。这个号码本身可能很长,但只要通过 Base62 编码,转换成 0-9、a-z、A-Z 这 62 个字符表示,就能得到一段比较短的码。这样做的好处是短码长度相对可控,唯一性也比较好保证。

哈希法则是另一种思路:把原始 URL 通过 MD5、SHA-1 等算法计算出一个摘要,再截取一小段作为短码。它看起来更随机,但存在碰撞风险,也就是说两条不同长链接可能得到同一串短码。因此,实际系统通常需要冲突检测、重新生成或扩展长度等机制。至于把二维码图片、页面内容或其他数据编码成字符串再放进链接的做法,并不常见,那更像是直接把信息塞进 URL,而不是常规意义上的短链服务。
用一段简单的 Python 代码模拟自增 ID 生成短码,会更直观一些:
import string
<img src="/uploads/20251015/25.png?t=1747918365" alt="" class="img-fluid" />
BASE_ALPHABET = string.digits + string.ascii_letters
def encode_id(url_id):
if url_id == 0:
return BASE_ALPHABET[0]
chars = []
while url_id > 0:
url_id, remainder = divmod(url_id, 62)
chars.append(BASE_ALPHABET[remainder])
return "".join(reversed(chars))
def create_short_link(original_url, url_id):
domain = "https://short.ly/"
return domain + encode_id(url_id)
print(create_short_link("https://example.com/very/long/url", 12345))

这里的思路很直接:假设数据库给某个 URL 分配了 ID 12345,程序把这个数字不断除以 62,再把余数映射到 Base62 字符集里,最后倒序拼接,就得到类似 3d7 的短码。域名和短码拼起来,就是用户看到的短链接。实际线上系统当然会更复杂,比如要考虑 ID 生成、并发写入、短码回收、黑名单词过滤、防猜测等问题,但基础逻辑大致就是这样。
短码为什么可以这么短?这也是一个容易被忽略的点。Base62 一共有 62 个字符,3 位理论上可以组合出二十多万种结果,4 位就能达到上千万种。对大多数业务场景来说,这样的容量已经足够使用。当然,短码不是越短越好。太短,容易撞到保留词、敏感词、广告词,也可能增加猜测风险;太长,又失去了“缩短”的意义。成熟系统往往会在长度、容量、可读性、安全性和业务需求之间做平衡。
用户访问短链接时,流程通常是这样:浏览器输入或点击 https://bit.ly/3jeyi05 这样的地址,请求会先到短链服务。服务端从 URL 中提取出 3jeyi05 这段短码,然后去存储系统里查它对应的原始长链接。查到了,就返回一个 HTTP 重定向响应,让浏览器继续访问原始地址。这里常见的是 301 和 302 两种状态码。301 表示永久重定向,浏览器可能会缓存,后续再访问同类短链时,有时不会每次都完整经过短链服务器。302 表示临时重定向,更适合需要保留统计机会的场景,因为请求更可能经过服务端,系统就有机会记录点击、来源、设备等数据。不过具体选择哪一种,还是要看业务目标是跳转稳定、数据可追踪,还是用户体验更轻。
从实现层面看,短链接服务看似简单,对工程能力其实有要求。最基础的存储可以是关系型数据库,比如用一张表保存短码、原始 URL、创建时间、状态、扩展字段等信息。数据量小的时候,直接查库问题不大。可一旦访问变多,热点链接会被频繁查询,数据库压力就会上升,所以通常会引入 Redis 之类的缓存系统,把访问频繁、生成不久的短码放入缓存。对于更大规模的平台,还可能需要按短码或某个稳定字段做分库分表,把数据分布到不同数据库节点上,提高并发查询能力。CDN 也可以用来加速静态页面、重定向入口或相关资源访问,尤其是面向全球用户的服务,网络节点和延迟体验会变得重要。
安全性也不能忽视。短链服务虽然只是一个跳转入口,但因为流量集中,很容易成为恶意利用的目标。比如有人可能批量生成钓鱼链接,或者通过枚举短码猜测未公开链接。对此,系统通常会通过随机短码、频率限制、访问控制、黑名单规则、异常流量检测等方式来降低风险。传输层面一般会使用 HTTPS,确保短链解析和跳转过程不容易被窃取或篡改。如果涉及用户行为统计,还要注意隐私边界,尽量只记录必要且可匿名化的数据,而不是把敏感个人信息长期明文存储。
很多产品功能其实都是在这套映射和重定向机制上加出来的。比如自定义短码,本质上是在写入映射时让用户指定或申请一段短码,只要系统确认没冲突即可。批量生成,就是把提交、校验、ID 生成、存储、返回短码这套流程批量化处理。设置有效期,是在数据库里增加过期时间字段,访问时先判断链接是否有效。访问密码、多端跳转、数据统计、API 接口、更换目标地址,也都不是魔法,而是把映射关系设计得更完整,再在访问入口增加判断逻辑。像线下物料已经印了二维码,之后却需要更换目标页,这类需求之所以能实现,正是因为用户看到的短链没有变,变的是服务端保存的目标 URL。
应用场景也很日常。社交媒体经常限制字符长度,长链接既占地方,又容易断,短链接能减少占用空间,也更适合阅读和点击。营销推广里,短链接常被用来追踪渠道来源、点击次数、设备类型和地域分布,帮助判断哪些素材有效。电商分享商品页、活动页、落地页时,短链接看起来更干净,复制和转发也更友好。线下海报、包装、工牌、活动物料印二维码时,短链服务还能让后台在需要时调整跳转目标,避免物料一次性浪费。开发者则常用 API 自动生成或管理短链接,把能力嵌入到系统、活动平台和投放流程里。
看起来简单的 URL 缩短,其实很容易被低估。用户看到的可能只是十几二十个字符,背后却涉及唯一标识生成、数据库映射、缓存加速、重定向选择、安全风控、数据统计和接口集成。它之所以好用,不是因为技术多神秘,而是把“输入一个网址,找到另一个网址”这件事做得足够轻、足够快、足够稳。对普通用户来说,短链接让分享更顺手;对产品和运营来说,短链接则像是连接内容与数据的一个小枢纽。
今すぐログイン