4.2MB 的域名重定向服务
手头囤了一堆闲置域名,想做跳转服务却被 Caddy 的配置文件搞得头疼?这个 4.2MB 的 Go 服务可能正是你需要的解决方案。
domain-redirect 是一个专门解决域名重定向需求的轻量级服务。它把复杂的配置变成几行环境变量。这样既简单又灵活,能满足生产环境的需求。
项目地址: https://github.com/nexmoe/domain-redirect
三分钟上手
最简单的部署方式是使用 Docker:
docker run -d \
-p 8080:8080 \
-e DOMAIN_MAPPING_1=example.com->https://target1.com,https://target2.com \
nexmoe/domain-redirect
这条命令会启动一个重定向服务,将访问example.com
的请求轮询转发到两个目标地址。
PORT
: 服务监听端口,默认为 8080PRESERVE_PATH
: 是否保持原始路径,默认为 false。设置为 “true” 时,重定向会保留原始请求路径INCLUDE_REFERRAL
: 是否携带来源域名信息,默认为 false。设置为 “true” 时,重定向会添加 ref 参数ENABLE_TIMESTAMP
: 是否启用时间戳参数,默认为 false。设置为 “true” 时,重定向会添加 _t 参数防止缓存
如果需要更复杂的配置,创建一个docker-compose.yml
文件:
version: '3'
services:
domain-redirect:
image: nexmoe/domain-redirect
ports:
- "8080:8080"
environment:
- DOMAIN_MAPPING_1=blog.example.com->https://blog.target.com
- DOMAIN_MAPPING_2=shop.example.com->https://shop1.com,https://shop2.com
- PRESERVE_PATH=true
- INCLUDE_REFERRAL=true
restart: unless-stopped
现在,所有域名都按配置规则重定向。路径会保留,来源信息会添加到 URL 中用于统计。
完整配置说明
域名映射配置
服务通过环境变量进行配置,每个域名映射规则使用 DOMAIN_MAPPING_*
格式:
DOMAIN_MAPPING_<任意名称>=<域名>-><目标地址1>,<目标地址2>,...
例如:
DOMAIN_MAPPING_1=example.com->https://target1.com,https://target2.com
DOMAIN_MAPPING_BLOG=blog.example.com->https://myblog.com
DOMAIN_MAPPING_SHOP=shop.example.com->https://shop1.com,https://shop2.com,https://shop3.com
使用示例
假设配置了完整的参数:
DOMAIN_MAPPING_1=example.com->https://target1.com,https://target2.com
PRESERVE_PATH=true
INCLUDE_REFERRAL=true
ENABLE_TIMESTAMP=true
当访问 http://example.com/api/users
时,可能会重定向到:
https://target1.com/api/users?ref=example.com&_t=1672531200
轻量化
镜像只有 4.2MB,内存占用 1.277MB。轻量化设计带来成本优势,部署和扩展也更方便。
传统的 Web 服务器如 Nginx 或 Apache 镜像有几十 MB。对于重定向需求来说太重了。domain-redirect 用 Go 语言开发。Go 编译后的二进制文件小,运行时开销低。
更重要的是环境变量配置方式的选择。相比配置文件,环境变量在容器化部署中具备天然优势:
- 容器编排平台(如 Kubernetes)对环境变量有原生支持
- 配置变更无需重构镜像,只需重启容器
- 敏感信息可以通过 Secret 管理,避免明文存储
来源追踪与数据分析
INCLUDE_REFERRAL
参数启用后,重定向 URL 会自动添加ref
参数,值为来源域名。
这个功能解决了跳转服务的关键痛点:流量来源追踪。传统的 HTTP Referer 头经常被浏览器过滤或修改。URL 参数更可靠。
配合 Google Analytics 等统计工具,你能精确知道哪些域名为目标站点带来流量,评估不同域名的价值。这对拥有多个域名的站长很实用。
KISS (Keep It Simple, Stupid)
domain-redirect 的设计不试图成为全能的反向代理。它专注于重定向这一核心功能。
Go 语言的选择值得思考。Go 是编译型语言,部署更一致。你不需要担心目标环境的运行时版本问题。Go 的并发模型天然适合处理大量 HTTP 重定向请求。
轮询状态保存在内存中,重启后重置到第一个目标。这种设计牺牲了状态持久化,但简化了架构复杂度。对重定向服务来说这是合理的权衡。