从 http.Request
获取所有客户端 IP 地址的正确方法是什么?在 PHP
中有很多我应该检查的 变量。 Go 也一样吗?
我发现的一个是:
req.RemoteAddr
请求是否区分大小写?例如 x-forwarded-for
与 --- X-Forwarded-For
和 X-FORWARDED-FOR
相同? (来自 req.Header.Get("X-FORWARDED-FOR")
)
原文由 Kokizzu 发布,翻译遵循 CC BY-SA 4.0 许可协议
查看 http.Request 可以找到以下成员变量:
您可以使用
RemoteAddr
获取远程客户端的 IP 地址和端口(格式为“IP:port”),这是原始请求者 或最后一个代理 的地址(例如负载均衡器在你的服务器前面)。这就是您所拥有的一切。
然后您可以调查 不区分大小写 的标头(根据上面的文档),这意味着您的所有示例都将起作用并产生相同的结果:
这是因为在内部
http.Header.Get
将为您规范化密钥。 (如果您想直接访问标头映射,而不是通过Get
,则需要先使用 http.CanonicalHeaderKey 。)最后,
"X-Forwarded-For"
可能是您想要查看的字段,以便获取有关客户端 IP 的更多信息。不过,这在很大程度上取决于远程端使用的 HTTP 软件,因为客户端可以根据需要在其中放置任何内容。另外,请注意此字段的 预期 格式 是逗号+空格分隔的 IP 地址列表。您需要稍微解析它以获得您选择的单个 IP(可能是列表中的第一个),例如:将产生: