我正在尝试编写一个返回客户端IPv4地址的函数。
我从http.Request.RemoteAddr
获取字符串,并使用net.SplitHostPort
过滤掉ip。这给了我:: 1,因为我在localhost上,我认为它应该是一个IPv6地址?
然后我ip := net.ParseIP(s)
然后ip = ip.To4()
获取IPv4地址。
我在Windows上并在我的主机文件中有这个:(其余的已注释掉。)
127.0.0.1 localhost localhost.com www.localhost.com *.localhost.com
基本上我希望得到127.0.0.1,但我无法得到它。
这是代码:
func FilterIpv4(r *http.Request) (string, error) {
var s string
// if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
// ip = xff
// }
s, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
return "", err
}
ip := net.ParseIP(s)
ip = ip.To4()
spew.Dump(ip.String()) // outputs "<nil>"
return "", nil
}
编辑:
我不知道这样做是否是一个好主意但至少我现在得到了ipv4地址。也许我应该坚持使用ipv6?我不知道这个。但是替换这段代码:
log.Fatal(http.ListenAndServe(":"+config.SrvPort, router))
有了这个:
ln, err := net.Listen("tcp4", ":"+config.SrvPort)
if err != nil {
log.Fatal(err)
}
log.Fatal(http.Serve(ln, router))
让我可以获得ipv4地址。
有人知道这一般是不是一个好主意?或者我应该坚持使用ipv6地址?
编辑2:
我最终得到了这个功能:
func FilterIP(r *http.Request) (string, error) {
var ip string
var err error
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
ips := strings.Split(xff, ", ")
ip = ips[0]
} else {
ip, _, err = net.SplitHostPort(r.RemoteAddr)
if err != nil {
return "", err
}
}
if !IsIP(ip) {
return "", err
}
return ip, nil
}
我将保存ipv6和ipv4地址。