本文介绍使用 go 标准库 `net/http/httputil.revers

在实际部署中,若仅通过前端 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))
}? 关键说明与注意事项:
通过此方案,你不再需要修改博客程序本身,即可让 mynewurl.com 成为面向用户的统一入口,同时保障每个文章 URL 具备独立性、可访问性与可引用性——这才是现代 Web 服务应有的基础设施实践。