回答

收藏

从 http.Request 获取客户端 IP 地址的正确方法

技术问答 技术问答 238 人阅读 | 0 人回复 | 2023-09-12

获取所有客户端 IP 地址的正确方法是http.Request什么?在PHP我应该检查很多变数。Go 上也一样吗?
% V4 I/ l/ u6 g我发现的一个是:
5 Q6 w, R- B* s7 @; M
    req.RemoteAddr. U3 J+ f/ o/ e$ m# E
请求是否区分大小写?x-forwarded-for与X-Forwarded-For和相同X-FORWARDED-FOR?(来自req.Header.Get("X-FORWARDED-FOR"))2 T) @6 X7 f9 P0 ^: D  E+ W0 K
                                                                1 S6 T$ r5 L/ M; `4 T
    解决方案:                                                               
2 [: u* z8 l3 K" |2 _# L                                                                查看http.Request您可以找到以下成员变量:
$ s. i0 U1 Y( b9 V. m+ w# Xusually for// logging. This field is not filled in by ReadRequest and// has no defined format. The HTTP server in this package// sets RemoteAddr to an "IP:port" address before invoking a// handler.// This field is ignored by the HTTP client.RemoteAddr string[/code]usually for// logging. This field is not filled in by ReadRequest and// has no defined format. The HTTP server in this package// sets RemoteAddr to an "IP:port" address before invoking a// handler.// This field is ignored by the HTTP client.RemoteAddr string[/code]您可以使用RemoteAddr 获取远程客户端IP 地址和端口(格式为IP:port),这是原请求者,或者最后一个代理(例如,位于您服务器前的负载平衡器)地址。& ?0 n" T: E. K' Q1 z( i' J
这就是你所拥有的一切。
4 J; h6 T: q! g$ |6 P) H. t然后你可以调查不区分大小写标题(根据上述文件),这意味着你所有的例子都会工作并产生相同的结果:0 q/ s+ R5 o7 \" a- p! }
    req.Header.Get("X-Forwarded-For") // capitalisationreq.Header.Get("x-forwarded-for") // doesn'treq.Header.Get("X-FORWARDED-FOR") // matter. G4 o, y+ G- j7 n
这是因为内部http.Header.Get将为您规范密钥。(如果您想直接访问标头映射,而不是通过Get,需要先用http.CanonicalHeaderKey。)
* |4 @# M: w* ^3 z最后,"X-Forwarded-For"可能是您想查看的字段,以获取相关客户端 IP 更多信息。这在很大程度上取决于远程端使用的 HTTP 软件,因为客户端可以根据需要包含任何内容。请注意,此字段预期格式是逗号 空格分隔 IP 地址列表。您需要对您选择的单个 进行一点分析IP(也许是列表中的第一个 IP),例如:5 w- ~3 _' _0 G  ?" y) j% |; U
    // Assuming format is as expectedips := strings.Split("10.0.0.1,10.0.0.2,10.0.0.3",",")for _,ip := range ips    fmt.Println(ip)}) `5 {% g0 c/ p' }
将产生:; G8 X& s) t: n1 x
    10.0.0.110.0.0.210.0.0.3  I  t; b+ k7 U2 l6 A
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则