前言

网络上有很多可以公开使用的短链接网站,但由于被滥用或其他原因不适合作为稳定的服务来使用。前段时间注册了域名 xvo.es,打算弄个自用的链接缩短服务。尝试了一些可以自托管的短链接服务之后,我选择了 kutt 并使用了一段时间。

然而 kutt 于我而言还是太「庞大」了,我想寻找一个更简单的链接缩短应用。

链接缩短程序运作原理是依靠 HTTP 重定向,那我们为什么不借助静态托管平台的批量重定向功能来实现呢?

启发

灵感来自基于 C 语言的链接缩短程序 1,我们使用静态部署即可实现个人短链接服务

.
├── 404.html  # 404 页面
├── _redirects  # Cloudflare Pages 重定向配置
├── index.html  # 主页面
├── lists.html  # 短链接罗列页面
└── vercel.json  # Vercel 重定向配置

项目地址: https://github.com/MoeOffice/xvo.es

这是一个可自托管的最简单链接缩短程序,能实现我想要的简单特性:

  • 纯静态部署,易于维护且足够稳定
  • 无需数据库和 Serverless 函数即可运行
  • 服务完全由自己掌控,不必担心滥用

xvo.es

部署

程序很简单,本文以 Cloudflare PagesVercel 为例,理论上它适合其他各种支持批量 URL 重定向的静态托管平台

Cloudflare Pages

Cloudflare Pages 的单个项目支持 2,000 个静态重定向和 100 个动态重定向,每个重定向声明有 1,000 个字符的限制。格式错误的声明会被忽略。

Fork 项目源码,修改 _redirects 文件里的重定向规则,写法如下:

[源 URL] [目标 URL] [状态码]

# [状态码是可选的,默认 302]
- 302 临时重定向
- 301 永久重定向

比如:

/blog https://www.dejavu.moe 302
/pgp https://pgp.dejavu.moe 302
/github https://github.com/DejavuMoe 302

修改 lists.html 文件,这里罗列我们的短链接,你可以将自己使用的短链接写在这里,比如:

<pre><code>URL lists:<a href="/blog"> /blog </a>|<a href="/pgp"> /pgp </a>|<a href="/github"> /github </a>|<a href="/telegram"> /telegram </a>|<a href="/group"> /group </a></code></pre>

将修改后的项目部署到 Cloudflare Pages

Vercel

Vercel 的单个项目最多支持 1,024 个重定向,源 URL 和目标 URL 的最大长度为 4,096

Fork 项目源码,修改 vercel.json 文件里的重定向规则,写法如下:

{
  "redirects": [
    {
      "source": "源 URL 1",
      "destination": "目标 URL 1",
      "permanent": false
    },
    {
      "source": "源 URL 2",
      "destination": "目标 URL 2",
      "permanent": false
    }
  ]
}

其中 permanent 可以为 true(永久重定向) 或 false(临时重定向),比如:

{
  "redirects": [
    {
      "source": "/blog",
      "destination": "https://www.dejavu.moe",
      "permanent": false
    },
    {
      "source": "/pgp",
      "destination": "https://pgp.dejavu.moe",
      "permanent": false
    },
    {
      "source": "/github",
      "destination": "https://github.com/MoeOffice/xvo.es",
      "permanent": false
    },
    {
      "source": "/telegram",
      "destination": "https://t.me/dejavuBlog",
      "permanent": false
    },
    {
      "source": "/group",
      "destination": "https://t.me/dejavuGroup",
      "permanent": false
    }
  ]
}

同理,修改 lists.html 文件里罗列的短链接,然后将项目部署到 Vercel 即可。

可选

此外,如果服务使用顶级域名 (Apex Domain),比如 xvo.es,建议将 www.xvo.es 重定向到 xvo.es。Cloudflare 可以使用「页面规则」中的 Bulk Redirects Rules 实现, Vercel 可以直接在绑定域名里设置重定向。

现在,这个极其简单的个人短链接服务就可以使用啦 😄

参考资料


  1. 这个程序是 clink,可以查看 演示网址 ↩︎