进阶 www.iris-go.com 2026-10-20 02:39:14 · 18 阅读
第32章 HTTP Referrer处理
# 第32章 HTTP Referrer
了解如何在 Iris 中处理 HTTP referrer 信息。
## 基础 Referrer 处理
package main
import "github.com/kataras/iris/v12"
func main() {
app := iris.New()
app.Get("/referrer", func(ctx iris.Context) {
// 获取 referrer URL
referrer := ctx.GetReferrer()
ctx.JSON(iris.Map{
"referrer": referrer.URL,
"type": referrer.Type,
})
})
app.Listen(":8080")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## Referrer 类型 app.Get("/referrer-type", func(ctx iris.Context) { referrer := ctx.GetReferrer() // 判断 referrer 类型 switch referrer.Type { case iris.ReferrerSearch: ctx.WriteString("来自搜索引擎") case iris.ReferrerSocial: ctx.WriteString("来自社交媒体") case iris.ReferrerIndirect: ctx.WriteString("间接流量") case iris.ReferrerEmail: ctx.WriteString("来自邮件") default: ctx.WriteString("直接流量") } }) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Referrer 策略 app.Use(func(ctx iris.Context) { // 设置 referrer 策略 ctx.Header("Referrer-Policy", "strict-origin-when-cross-origin") ctx.Next() }) app.Get("/secure", func(ctx iris.Context) { referrer := ctx.GetReferrer() if referrer.Type == iris.ReferrerIndirect { ctx.WriteString("外部 referrer") } else { ctx.WriteString("内部 referrer") } }) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Referrer 校验 func validateReferrer(ctx iris.Context) bool { referrer := ctx.GetReferrer() allowedDomains := []string{ "example.com", "trusted-site.com", } for _, domain := range allowedDomains { if strings.Contains(referrer.URL, domain) { return true } } return false } app.Get("/protected", func(ctx iris.Context) { if !validateReferrer(ctx) { ctx.StopWithStatus(iris.StatusForbidden) return } ctx.WriteString("允许访问") }) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
最佳实践 安全:验证 referrer、设置正确策略、处理缺失值、监控访问、记录可疑模式 实施:检查所有类型、处理空值、记录策略、充分测试、遵循标准 性能:缓存验证、优化检查、监控影响、处理超时、清理资源 维护:更新策略、监控使用情况、记录变更、定期测试、审查安全
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## Referrer 类型 app.Get("/referrer-type", func(ctx iris.Context) { referrer := ctx.GetReferrer() // 判断 referrer 类型 switch referrer.Type { case iris.ReferrerSearch: ctx.WriteString("来自搜索引擎") case iris.ReferrerSocial: ctx.WriteString("来自社交媒体") case iris.ReferrerIndirect: ctx.WriteString("间接流量") case iris.ReferrerEmail: ctx.WriteString("来自邮件") default: ctx.WriteString("直接流量") } }) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Referrer 策略 app.Use(func(ctx iris.Context) { // 设置 referrer 策略 ctx.Header("Referrer-Policy", "strict-origin-when-cross-origin") ctx.Next() }) app.Get("/secure", func(ctx iris.Context) { referrer := ctx.GetReferrer() if referrer.Type == iris.ReferrerIndirect { ctx.WriteString("外部 referrer") } else { ctx.WriteString("内部 referrer") } }) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Referrer 校验 func validateReferrer(ctx iris.Context) bool { referrer := ctx.GetReferrer() allowedDomains := []string{ "example.com", "trusted-site.com", } for _, domain := range allowedDomains { if strings.Contains(referrer.URL, domain) { return true } } return false } app.Get("/protected", func(ctx iris.Context) { if !validateReferrer(ctx) { ctx.StopWithStatus(iris.StatusForbidden) return } ctx.WriteString("允许访问") }) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
最佳实践 安全:验证 referrer、设置正确策略、处理缺失值、监控访问、记录可疑模式 实施:检查所有类型、处理空值、记录策略、充分测试、遵循标准 性能:缓存验证、优化检查、监控影响、处理超时、清理资源 维护:更新策略、监控使用情况、记录变更、定期测试、审查安全