http.redirect 是实现 302 跳转最简方式,自动设状态码与 location 头;需用绝对 url,避免重复写头 panic;方法保留选 307/308;防开放重定向须校验同域;反代下需读 x-forwarded-proto 判断协议。

用 http.Redirect 实现 302 临时跳转最简单
绝大多数场景下,直接调用 http.Redirect 就够了,它会自动设置状态码、Location 头,并立即写响应。不需要手动调 w.WriteHeader 或 w.Header().Set,否则容易重复写头导致 panic。
常见错误现象:http: superfluous response.WriteHeader call —— 就是自己先写了状态码,又调 Redirect,它内部又写了一次。
-
http.Redirect默认发的是302 Found,浏览器会重用原请求方法(比如 POST 跳转后仍可能重发 POST,但实际多数浏览器会降级为 GET) - 第三个参数必须是**绝对 URL**,比如
"https://example.com/login";给相对路径如"/login"会出错或跳到错误地址 - 第四个参数是状态码,想强制用 301 写
http.StatusMovedPermanently,但注意:搜索引擎会缓存 301,测试阶段别乱用
http.Redirect(w, r, "https://example.com/dashboard", http.StatusFound)
需要保留原始请求方法?用 307 Temporary Redirect 或 308 Permanent Redirect
默认的 302 和 301 都可能把 POST 变成 GET,如果你做 API 网关或代理跳转,且要求方法不变(比如 POST /v1/old → POST /v2/new),就得选 307 或 308。
使用场景:微服务间路由迁移、灰度接口切换、表单提交链路重定向。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
307是临时的,不被客户端长期缓存;308是永久的,类似 301,但保方法 - 浏览器支持没问题(Chrome/Firefox/Edge 均支持),但老版本 iOS Safari 对 308 支持不稳定,线上用 307 更稳妥
- 别手写状态码数字,用标准常量:
http.StatusTemporaryRedirect或http.StatusPermanentRedirect
http.Redirect(w, r, "https://api.example.com/v2/submit", http.StatusTemporaryRedirect)
重定向目标 URL 怎么拼才安全?别硬连字符串
用户输入、查询参数、路径片段如果直接拼进跳转 URL,可能引发开放重定向漏洞(Open Redirect),攻击者诱导用户跳到恶意站点。
常见错误现象:URL 中出现 ?next=https://evil.com,后端没校验就跳过去。
- 永远检查
next类参数是否为**同域绝对 URL**,推荐用url.Parse解析后比对Host和Scheme - 避免用
strings.HasPrefix(next, "/")这种方式判断“相对路径”,因为//evil.com也是合法 URL 且会被当成协议相对 URL - 内部跳转优先用路径白名单,比如只允许跳
["/dashboard", "/profile", "/settings"],其余一概 fallback 到"/"
HTTP/HTTPS 混合部署时,r.URL.Scheme 不可靠
如果 Go 服务前面挂了 Nginx 或 ELB,且用了 HTTPS 终止,那么 r.URL.Scheme 永远是 "http",导致拼出来的跳转地址变成 http://...,触发混合内容警告甚至被浏览器拦截。
根本原因:反向代理没传 X-Forwarded-Proto,或 Go 没读这个 header。
- 确保反向代理设置了
proxy_set_header X-Forwarded-Proto $scheme;(Nginx)或等效配置 - Go 里要主动读:
proto := r.Header.Get("X-Forwarded-Proto"),如果为空才 fallback 到r.URL.Scheme - 别依赖
r.TLS != nil判断 HTTPS —— TLS 在反代后就结束了,这个字段总是 nil
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










