Get client IP Address in Go
Knowing who is accessing your web server can be useful for tracking a user's activity. In this tutorial, we will learn how to get client IP address in Go.
To get the IP address of a client, just use
ip,_,_ := net.SplitHostPort(r.RemoteAddr)
However, sometimes the user access your web server via a proxy or load balancer ( such as in cloud hosting etc ) and the above code will give you the IP address of the proxy or load balancer.
To get the real IP address of the client, you can get the HTTP Request header information "X-Forwarded-For (XFF)"
fmt.Fprintf(w,"X-Forwarded-For :" + r.Header.Get("X-FORWARDED-FOR"));
This is the full code example that you can execute in your web server and test out with your web browser or curl.
client_ip.go
package main
import (
"fmt"
"net/http"
"net"
)
func IndexPage(w http.ResponseWriter, r *http.Request) {
// get client ip address
ip,_,_ := net.SplitHostPort(r.RemoteAddr)
// print out the ip address
fmt.Fprintf(w,ip + "\n\n")
// sometimes, the user acccess the web server via a proxy or load balancer.
// The above IP address will be the IP address of the proxy or load balancer and not the user's machine.
// let's get the request HTTP header "X-Forwarded-For (XFF)"
// if the value returned is not null, then this is the real IP address of the user.
fmt.Fprintf(w,"X-Forwarded-For :" + r.Header.Get("X-FORWARDED-FOR"));
}
func main() {
http.HandleFunc("/", IndexPage)
http.ListenAndServe(":8080", nil)
}
References:
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+5.9k Golang : Transform lisp or spinal case to Pascal case example
+11.5k Golang : Transform comma separated string to slice example
+23.2k Golang : convert rune to integer value
+44.1k Golang : Marshal and unmarshal json.RawMessage struct example
+4.8k Golang : Launching your executable inside a console under Linux
+4.7k Golang : Fix opencv.LoadHaarClassifierCascade The node does not represent a user object error
+7.7k Golang : GMail API create and send draft with simple upload attachment example
+15.1k Golang : Get the IPv4 and IPv6 addresses for a specific network interface
+46k Golang : How to convert JSON string to map and slice
+11k Golang : How to parse plain email text and process email header?
+33.6k Golang : Get file last modified date and time
+7.2k PHP : How to parse ElasticSearch JSON ?