
本文介绍使用 go 标准库 `net/http/httputil.reverseproxy` 构建反向代理服务,将新域名(如 `http://mynewurl.com`)的请求无损转发至本地博客服务(如 `http://oldurl.com:8000`),完整保留路径、查询参数和 host 头,确保文章链接(如 `/proposal`)可直接分享与被 webmention 正确识别。
在实际部署中,若仅通过前端 iframe 嵌入或简单重定向(如 301/302),会导致浏览器地址栏始终显示主域名(如 mynewurl.com/),所有子路径(如 /proposal)无法在 URL 栏中体现,进而使社交分享、SEO 和 Webmention 等依赖原始 URL 的功能失效。此时,反向代理(Reverse Proxy)是更专业、透明且符合 HTTP 语义的解决方案——它让客户端“以为”自己正与 mynewurl.com 直接通信,而服务端在后台无缝将请求转发至 oldurl.com:8000,并原样返回响应。
Go 提供了开箱即用的 httputil.NewSingleHostReverseProxy(推荐)和底层 httputil.ReverseProxy,二者均能精准控制请求重写逻辑。以下是一个生产就绪的最小可行示例:
package main
import (
"fmt"
"log"
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
// 目标后端服务地址(你的博客服务)
backendURL, err := url.Parse("http://oldurl.com:8000")
if err != nil {
log.Fatal("无效的后端地址:", err)
}
// 创建反向代理实例
proxy := httputil.NewSingleHostReverseProxy(backendURL)
// 可选:自定义 Director 函数,精确控制请求重写
// (例如修复 Host 头、添加 X-Forwarded-* 头等)
originalDirector := proxy.Director
proxy.Director = func(req *http.Request) {
originalDirector(req)
// 强制设置 Host 为后端真实 Host(避免被客户端 Host 覆盖)
req.Host = backendURL.Host
// 可选:添加标准代理头,便于后端日志与安全策略识别
req.Header.Set("X-Forwarded-For", req.RemoteAddr)
req.Header.Set("X-Forwarded-Proto", "http") // 若使用 HTTPS,应设为 "https"
}
// 启动监听 —— 注意:此处监听的是新域名对应的服务端口(如 80 或 443)
// 实际部署时建议使用 systemd/Nginx 做端口转发,或直接绑定 :80(需 root 权限)
port := ":80"
fmt.Printf("✅ 反向代理已启动,监听 %s → 转发至 %s\n", port, backendURL.String())
log.Fatal(http.ListenAndServe(port, proxy))
}? 关键说明与注意事项:
- ✅ 路径完全透传:/proposal 请求会原样转发至 http://oldurl.com:8000/proposal,响应也原路返回,浏览器地址栏始终显示 mynewurl.com/proposal;
- ✅ Header 与 Body 完整保留:包括 Cookie、Authorization、Content-Type 等,无需额外处理;
- ⚠️ Host 头处理:NewSingleHostReverseProxy 默认将 req.Host 设为目标地址,但若后端依赖原始 Host(如多租户路由),需在 Director 中显式恢复 req.Host = req.Header.Get("X-Forwarded-Host");
- ⚠️ HTTPS 支持:若 mynewurl.com 使用 HTTPS,需配合 TLS 配置(如 http.ListenAndServeTLS),并将 X-Forwarded-Proto 设为 "https",确保后端生成的绝对链接(如 )协议正确;
- ?️ 安全性建议:生产环境务必配置 X-Forwarded-* 头校验(如只信任可信代理 IP),防止伪造;可结合 gorilla/handlers.ProxyHeaders 简化处理。
通过此方案,你不再需要修改博客程序本身,即可让 mynewurl.com 成为面向用户的统一入口,同时保障每个文章 URL 具备独立性、可访问性与可引用性——这才是现代 Web 服务应有的基础设施实践。










