一个基于 DNS TXT 记录的轻量网关。
它会读取你提供的域名 TXT 记录,从中解析目标 URL,然后:
- 默认执行 302 跳转到目标 URL
- 当
redirect=false时返回目标 URL 字符串(不跳转)
适合做“域名配置驱动”的跳转入口,例如短链入口、灰度入口、多目标随机分流等。
- 只接受
GET请求 - 路由:
/:domain/:key? - 支持两种 TXT 配置格式:
- 空格分隔 URL 列表
- Base64(TOML)(支持 key 精确匹配 + 权重随机)
- 目标 URL 会经过 URL 格式校验
- 自定义域名约束(FQDN)
cloud-functions/
index.go # Fiber 入口
dns/query.go # DNS TXT 查询
tp-parser/tp-parser.go # TXT 解析与目标选择
custom-constraints/fqdn.go# 路由 fqdn 约束
要求:Go 1.26+
cd cloud-functions
go mod tidy
go run index.go默认监听:0.0.0.0:9000
健康检查(主页):
curl "http://127.0.0.1:9000/"GET /:domain/:key?domain:要查询 TXT 的域名,例如example.comkey:可选参数- 在 Base64(TOML) 配置中,用于匹配
K - 在“空格分隔列表”配置中,可作为下标(从
0开始)
- 在 Base64(TOML) 配置中,用于匹配
示例:
curl -i "http://127.0.0.1:9000/example.com"
curl -i "http://127.0.0.1:9000/example.com/home"
curl -i "http://127.0.0.1:9000/example.com/1"redirect 为布尔参数,默认是 true:
redirect=true:执行跳转redirect=false:返回原始 URL 字符串
示例:
curl "http://127.0.0.1:9000/example.com?redirect=true"
curl "http://127.0.0.1:9000/example.com?redirect=false"TXT 内容示例:
https://a.example.com https://b.example.com https://c.example.com
行为:
- 不带
key:返回第一个 URL key为合法下标(如0、1):返回对应 URL- 其他情况:回退到第一个 URL
该格式要求:先写 TOML,再把 TOML 文本做 Base64 编码,最终把 Base64 字符串写入 TXT。
TOML 原文示例(注意字段名是大写 U/K/V/W):
[[U]]
K = "home"
V = "https://www.example.com/"
W = 80
[[U]]
K = "docs"
V = "https://docs.example.com/"
W = 20将以上 TOML 编码成 Base64 后,写入 TXT(示意):
W1tVXQpLID0gImhvbWUiClYgPSAiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vIgpXID0gODAK...
字段说明:
K:keyV:目标 URLW:权重(无符号整数)
行为:
- 带
key且命中K:返回对应V - 未命中
key:按所有W做加权随机 - 若权重总和为 0:返回第一条
U[0].V
- 成功重定向:
302 - 成功返回 URL 字符串:
200 - 解析或校验失败:
400- 例如 DNS 查询失败、URL 非法等
- 仅支持 GET,请勿用 POST/PUT。
- 若目标 URL 不是
http:或https:,服务会直接返回字符串,不会重定向。 redirect建议只传true/false,非法布尔值会按false处理。- 使用加权随机时,请确保
W配置合理。
如果 example.com 的 TXT 是下面 TOML 的 Base64 结果:
[[U]]
K = "gh"
V = "https://github.com/rinnein"
W = 1则:
GET /example.com/gh-> 跳转到 GitHubGET /example.com/gh?redirect=false-> 返回https://github.com/rinnein
AGPL-3.0(见 LICENSE)