gin v1.7.7 版本(2021-11-24 发布),新增了设置信任代理服务器列表。
gin官方的说明:https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies
1.设置信任代理
设置信任代理服务器列表非常简单,只需要一个命令,在 ginskeleton 只需要在配置文件进行配置即可。
router = gin.Default()
router.SetTrustedProxies([]string{"192.168.10.1","192.168.10.2"})
2.为什么要设置信任代理服务器?
与其花费很大的篇幅去解答这个问题,不如我们一起探讨一下设置信任代理影响到哪几个方面,我们如何使用信任代理反而更容易理解该功能。
本篇结尾会附上一篇详细论述最终原因的文章,供大家阅读、深入理解。
2.1 设置信任代理以后是不是其他服务器就无法访问 gin 的接口了?
答案是否定的,gin
的接口依然可以被其他机器访问。
2.2 那么设置信任代理以后有什么影响?
由于实际项目可能部署在很复杂的网络环境,对于服务端获取客户端的 ip
相关函数 context.RemoteIP()
、 context.ClientIP()
会有影响。
func main() {
router := gin.Default()
// gin v1.7.7 版本(2021-11-24发布)以后,要求设置信任代理,否则就会在输出面板输出如下地址,告诉你去设置:
// https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies
// 设置信任代理的示例代码
router.SetTrustedProxies([]string{"192.168.10.1","192.168.10.2"})
// 如果gin前置没有代理,参数设置为 nil 即可
// r.SetTrustedProxies(nil)
router.GET("/test", func(context *gin.Context) {
// context.RemoteIP() 无代理返回客户端IP,有代理返回代理IP
// context.ClientIP() 无论是否有代理,都会返回客户端IP
// nginx 设置代理需要设置 x-forward*参数
// nginx 代理设置参见 45 行附近:https://www.yuque.com/xiaofensinixidaouxiang/bkfhct/kxddzd
context.ClientIP()
})
router.Run(":20201")
}
2.3 如果go服务前置有nginx代理,但是关闭信任有何影响?
//以下两个函数获取的ip都是代理机器的ip,无法获取客户端真实ip,
// 所以开发者必须按照gin官方要求设置信任项
context.ClientIP()
context.RemoteIP()