posts: 添加静态重定向组短链服务及相关文档

添加静态重定向组短链服务的实现,包括前端页面和后端逻辑。使用Cloudflare Worker和Github实现纯静态短链服务,支持无限重定向规则和有效期设置。同时添加相关文档说明部署步骤和使用方法。
This commit is contained in:
二叉树树
2026-01-15 00:11:45 +08:00
parent 15674002ab
commit f0b61114c4
2 changed files with 69 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1,69 @@
---
title: 完全免费!搭建一个自己的短链服务!
published: 2026-01-14T23:39:31
description: 利用Cloudflare Worker+Github搭建一个纯静态刷不死的短链吧
image: ../assets/images/static-redirect-group.png
draft: false
lang: ""
---
# 前言
本来不应该有这篇文章的因为这篇文章就是一个该项目的简单自部署教程应该写到仓库的README中本来应该是让AI代工的但是我发现它非常执着于那个b Github Page+Cloudflare Worker的神奇前后端分离而且徒增了不少工作。其实该项目仅需一个Cloudflare Worker就行了所以既然都要我手写了我氵篇文章也是合情合理的吧
# 项目原理
该项目和上一个短链项目差不多,但是更简化了一些东西
首先就是,这个项目我们将前后端揉在了一起,前端几乎不校验东西,所有校验在后端,也不用两个项目来回加规则了
由于该项目前端非常简单就两个html一个创建页面一个重定向页面所以将他们揉在一起也并不臃肿
再来该项目不再使用Cloudflare服务端的 301/302 重定向也就突破了2000个静态重定向的限制理论上是无限而是直接使用CDN对于静态资产命中404时会fullback到 404.html 再在该文件用 JavaScript 做短链查询和重定向也就跟Nginx伪静态差不多
再接着如果一个pathname没命中任何规则也会被catch到一个默认的回退源可以兼容类似 https://2x.nz/posts/pin/ --> https://blog.acofork.com/posts/pin/
然后就是创建短链的逻辑其实跟上一个项目差不多就是Worker代理访问Github改一下js添加一条新的短链规则然后推送这会自动触发Cloudflare Worker的重新构建稍等片刻后访问新的 pathname 就可以得到正确的重定向了
最后就是我们支持了有效期,原理也非常简单,前端创建短链的时候给后端传一个什么时候过期的字段,后端再写入文件,最后借助 Github Action 的定时巡查清除过期短链
# 在哪搞个短链
我的 2x.nz 是在 https://porkbun.com 买的,一年一百左右。其他后缀也不错,如 `.im` `.mk`
# 正式搭建你的短链服务
首先Fork仓库
::github{repo="afoim/Static_Redirect_Group"}
接下来先更改一些硬编码的东西由于Cloudflare Worker对于静态资产不能使用环境变量所以有些东西是硬编码的请在所有HTML文件中尝试搜索 `afoim` 进行更改,改成你的(你也可以多加一层,写一个配置,然后通过构建来注入内容,随你)
然后请编辑js文件夹里面的短链改为你想要的
再接着创建一个Github Token只需要有 `repo` 权限即可
继续,绑定机密环境变量,使用 `wrangler secret put XXX`
| 变量名 | 值 | 说明 |
| :--- | :--- | :--- |
| `GITHUB_TOKEN` | `ghp_xxxx...` | 刚才申请的 Token |
| `GITHUB_OWNER` | `你的GitHub用户名` | 例如 `afoim` |
| `GITHUB_REPO` | `Static_Redirect_Group` | 你的仓库名 |
| `BASE_DOMAIN` | `你的短链域名` | 例如 `u.2x.nz` 或 Worker 的默认域名 `xxx.workers.dev` |
此时,访问 `/_url` 即可创建你的短链
# 防护
建议保护创建短链的短链防刷或Cloudflare Turnstile、速率限制... 随你)
在Cloudflare创建一个WAF规则
当传入请求匹配时...
```sql
(http.host eq "你的域名" and (
http.request.uri.path eq "/_url"
or http.request.uri.path wildcard "/api/*"
))
```
然后采取措施…
**交互式质询**