golang如何获取客户端ip?


当前第2页 返回上一页

这个方法很简单,就是按照http约定的格式获取,其中X-Forwarded-For和X-Real-Ip header由反向代理填充,例如nginx或 haproxy。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

// ClientPublicIP 尽最大努力实现获取客户端公网 IP 的算法。

// 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。

func ClientPublicIP(r *http.Request) string {

var ip string

for _, ip = range strings.Split(r.Header.Get("X-Forwarded-For"), ",") {

ip = strings.TrimSpace(ip)

if ip != "" && !HasLocalIPddr(ip) {

return ip

}

}

ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))

if ip != "" && !HasLocalIPddr(ip) {

return ip

}

if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {

if !HasLocalIPddr(ip) {

return ip

}

}

return ""

}

ClientPublicIP很简单,和ClientIP方法的读取顺序一样,只是试图中X-Forwarded-For列表中找到一个公网ip,如果没有检查X-Real-Ip 是否是一个公网ip,其次检查 http.Request.RemoteAddr 是否是公网ip,如果没有找到公网ip这返回一个空字符串。

这个方法可以让我们有机会优先获取到用户的公网 ip,往往公网 ip 对我们来说更有价值。

推荐教程:《go语言教程》

以上就是golang如何获取客户端ip?的详细内容,更多文章请关注木庄网络博客!!

返回前面的内容

相关阅读 >>

【译】使用 go modules

聊聊go-ddd-sample

go - 常用签名算法的基准测试

golang如何升级?

手撸golang 基本数据结构与算法 数组

结合kubebuilder与code-generator开发operator

每个角色都不简单

理解 go 1.13 中 sync.pool 的设计与实现

go语言————3、编辑器、集成开发环境与其它工具

分享一个go json 踩坑记录

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...