从http.Request获取客户端IP地址的正确方法
从中获取所有客户端IP地址的正确方法是http.Request
什么?在PHP
其中,我应该检查很多变量。Go上也一样吗?
我发现的一个是:
req.RemoteAddr
并且请求区分大小写吗?例如x-forwarded-for
与X-Forwarded-For
和相同X-FORWARDED-
FOR吗?(来自req.Header.Get("X-FORWARDED-FOR")
)
回答:
查看http.Request,您可以找到以下成员变量:
// HTTP defines that header names are case-insensitive.// The request parser implements this by canonicalizing the
// name, making the first character and any characters
// following a hyphen uppercase and the rest lowercase.
//
// For client requests certain headers are automatically
// added and may override values in Header.
//
// See the documentation for the Request.Write method.
Header Header
// RemoteAddr allows HTTP servers and other software to record
// the network address that sent the request, 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
您可以RemoteAddr
用来获取远程客户端的IP地址和端口(格式为“ IP:端口”),它是原始请求者 或最后一个代理
(例如,位于服务器前面的负载平衡器)的地址。
这就是您确定的全部。
然后,您可以研究 不区分大小写 的标头(根据上面的文档),这意味着您的所有示例都将起作用并产生相同的结果:
req.Header.Get("X-Forwarded-For") // capitalisationreq.Header.Get("x-forwarded-for") // doesn't
req.Header.Get("X-FORWARDED-FOR") // matter
这是因为内部http.Header.Get
会为您标准化密钥。(如果要直接访问标头映射,而不要通过访问标头映射,则Get
需要先使用http.CanonicalHeaderKey。)
最后,"X-Forwarded-
For"可能是您想了解的领域,以便获取有关客户端IP的更多信息。但是,这很大程度上取决于远程端使用的HTTP软件,因为客户端可以根据需要将任何内容放入其中。另外,请注意,此字段的
预期 格式是IP地址的逗号加空格分隔列表。您将需要对其进行一点解析以获取您选择的单个IP(可能是列表中的第一个IP),例如:
// 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)
}
将产生:
10.0.0.110.0.0.2
10.0.0.3
以上是 从http.Request获取客户端IP地址的正确方法 的全部内容, 来源链接: utcz.com/qa/434677.html