4.2MB 的域名重定向服务

Nexmoe 2025年6月29日

手头囤了一堆闲置域名,想做跳转服务却被 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的请求轮询转发到两个目标地址。

如果需要更复杂的配置,创建一个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 编译后的二进制文件小,运行时开销低。

更重要的是环境变量配置方式的选择。相比配置文件,环境变量在容器化部署中具备天然优势:

来源追踪与数据分析

INCLUDE_REFERRAL参数启用后,重定向 URL 会自动添加ref参数,值为来源域名。

这个功能解决了跳转服务的关键痛点:流量来源追踪。传统的 HTTP Referer 头经常被浏览器过滤或修改。URL 参数更可靠。

配合 Google Analytics 等统计工具,你能精确知道哪些域名为目标站点带来流量,评估不同域名的价值。这对拥有多个域名的站长很实用。

KISS (Keep It Simple, Stupid)

domain-redirect 的设计不试图成为全能的反向代理。它专注于重定向这一核心功能。

Go 语言的选择值得思考。Go 是编译型语言,部署更一致。你不需要担心目标环境的运行时版本问题。Go 的并发模型天然适合处理大量 HTTP 重定向请求。

轮询状态保存在内存中,重启后重置到第一个目标。这种设计牺牲了状态持久化,但简化了架构复杂度。对重定向服务来说这是合理的权衡。