package main import ( "log" "net" "net/http" "strings" ) func main() { http.HandleFunc("/", handler) err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal(err) } } func handler(w http.ResponseWriter, req *http.Request) { ip := "" ips := proxy(req) if len(ips) > 0 && len(ips[0]) > 0 { rip, _, err := net.SplitHostPort(ips[0]) ip = rip if err != nil { ip = ips[0] } } else { if rip, _, err := net.SplitHostPort(req.RemoteAddr); err == nil { ip = rip } else { ip = req.RemoteAddr } } w.WriteHeader(200) w.Write([]byte(ip)) } func proxy(req *http.Request) []string { if ips := req.Header.Get("X-Forwarded-For"); len(ips) > 0 { return strings.Split(ips, ",") } return []string{} }