Golang中如何从请求头获取上一页地址?Referer头为空
在Golang中获取上一页地址(Referer为空的情况处理)
问题背景
在Golang的Gin框架中尝试通过请求头获取上一页地址,但Referer请求头为空。相关代码如下:
尝试打印Referer头的代码:
func temp(c *gin.Context) { tmp, _ := template.ParseFiles("index.html") err := tmp.Execute(c.Writer, "") println(c.Request.Header.Get("Referer")) if err != nil { return } }
这段代码执行后,打印出的Referer结果为空。同时用于打印全部请求头的代码:
requestDump, err := httputil.DumpRequest(c.Request, true) println(string(requestDump))
问题分析与解决方案
1. Referer为空的常见原因
Referer请求头是由浏览器主动发送的,为空的情况大多和浏览器行为或安全策略有关:
- 直接在地址栏输入URL访问,无前置跳转页面
- 从HTTPS页面跳转至HTTP页面,浏览器出于安全省略该头
- 浏览器设置或隐私插件禁用了Referer发送
- 通过书签、收藏夹直接打开页面
- 部分移动端浏览器或特殊环境下的请求也可能不携带Referer
2. 获取上一页地址的替代方案
既然Referer不可靠,可通过以下方式实现需求:
- URL参数传递:跳转时手动带上来源地址参数,比如跳转链接设为
/temp?from=/previous-page,后端读取:
from := c.Query("from") println("上一页地址:", from)
- Session存储:在用户访问页面时,将当前地址存入Session,后续需要时取出前一个记录的地址
- 自定义请求头:前端通过
document.referrer获取来源后,通过自定义头(如X-Custom-Referer)发送,后端读取:
customReferer := c.GetHeader("X-Custom-Referer") println("自定义来源地址:", customReferer)
3. 使用Referer的注意事项
如果必须依赖Referer,需要注意:
- 必须处理
Referer为空的场景,避免空指针或逻辑错误 - 对获取到的
Referer做合法性校验,防止恶意构造的地址引发安全问题
内容的提问来源于stack exchange,提问作者Apelsinovi_sok
相关产品推荐
相关产品推荐

