分享链接是一个很常见的需求,对于软件开发者,我们往往需要追踪一下用户行为,所以往往 url 会带有一些参数。链接长显得很臃肿,看起来不舒服,而且我们携带的信息也是明文的,容易被用户猜到改动,所以当遇到这些问题时,你可能需要一个短链接服务。

技术实现

短链接其实是一个短和长的一一映射关系,包含两个过程,一个是通过原始链接生成短链接;另一个是访问短链接跳转到原始链接。

首先,我们需要一个 kv store:

interface IKvStore {
  set(originUrl: string): string // 返回短链接
  get(shortUrl: string): string // 返回原始链接
}

所以问题的关键是我们怎么生成这个短链接(随机字符串)。想到随机字符串,首先想到的就是 uuid,但是 uuid 对于短链接来说长度太长。

有一种方案就是使用自增 id,然后 base58 得到短字符串,这种方式可以在不在意别人反向推算存在多少条记录和不在意短链接有规律时使用;

第二种方式是随机 1000 - 100000(数目根据自身调整),然后 base58 得到短字符串,区间长度就是我们分配的数额,这种方式能够保证字符串随机,缺点是有可能会撞到,会导致注册短链接失败,当然这种几率很少,随着记录数量的增加,我们可以调整随机数范围。

第二步,短链接请求过来的时候反查原始链接,302 跳转过去,注意:有可能查不到记录,这时候可以设置默认跳转链接。

我们能够得到什么?

  • 有效减少链接长度,防止篡改参数
  • 可以根据需求封禁或者转移分享出去的链接的流量