You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:45:44