和大家分享一个最近做的小工具——hink,一个用不到 10 行代码实现的短链接系统。
这个工具利用 Git 和 Serverless 平台,实现了短链接生成和访问统计功能。
核心原理:Git 提交哈希值的妙用
hink 的核心思路很简单:用 Git 的空提交哈希值作为短链接的唯一标识符,把原始长链接存储在提交信息中。访问短链接时,系统通过 GitHub 的 .patch
文件接口读取提交信息,提取长链接并重定向。结合云平台的 WAF(Web 应用防火墙)分析面板,还能实现访问统计。
目前,这个方案已经在以下平台测试通过:
- Cloudflare Workers/Snippets + Cloudflare WAF (Pro)
- 腾讯云 EdgeOne (Free)
- 阿里云 ESA (Free)
代码:极简实现
hink 的代码非常短小,核心逻辑只有几行。以下是针对不同平台的实现。
Cloudflare Workers / 阿里云 ESA 版本
const GIT_REPO = "https://github.com/ccbikai/hink"
export default {
async fetch(request) {
const { pathname } = new URL(request.url)
const gitPatch = `${GIT_REPO}/commit${pathname}.patch`
const patch = await fetch(gitPatch, { cf: { cacheEverything: true, cacheTtlByStatus: { '200-299': 86400 } }}).then(res => res.text())
const url = pathname === '/' ? GIT_REPO : patch.match(/^Subject:\s*\[PATCH\](.*)$/m)?.[1]?.trim()
return Response.redirect(url || GIT_REPO)
}
}
腾讯云 EdgeOne 版本
const GIT_REPO = "https://github.com/ccbikai/hink"
addEventListener("fetch", async (event) => {
const { pathname } = new URL(event.request.url)
const gitPatch = `${GIT_REPO}/commit${pathname}.patch`
const patch = await fetch(gitPatch).then(res => res.text())
const url = pathname === '/' ? GIT_REPO : patch.match(/^Subject:\s*\[PATCH\](.*)$/m)?.[1]?.trim()
event.respondWith(new Response(null, { status: 302, headers: { Location: url || GIT_REPO } }))
});
部署到 Serverless 平台后,绑定一个域名,就能拥有自己的短链接服务。
为什么做 hink?
短链接服务并不新鲜,市面上有很多工具。但 hink 的目标是探索一种极简且有趣的实现方式。利用 Git 提交哈希值,避免了数据库管理,借助 GitHub 实现存储,而云平台的 WAF 功能让访问统计变得简单。这对我来说是一次技术实验,用最少的代码解决实际问题。
演示效果:三大平台运行情况
我在 Cloudflare Workers、阿里云 ESA 和腾讯云 EdgeOne 上部署了 hink,并通过 WAF 面板查看访问统计。以下是各平台的运行截图: