1. 获取HTTP请求的IP地址

这篇文章演示了如何在Go中获取传入HTTP请求的IP地址。作为一种功能,它尝试使用X-FORWARDED-FORhttp头作为代理和负载均衡器(例如在Heroku之类的主机上)后面的代码,而RemoteAddr如果找不到该头,则会尝试使用http头。

举个例子,我们在下面创建了一个(各种各样的)回显服务器,以json形式使用请求的IP地址回复传入的请求。

  1. package main
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. )
  6. func main() {
  7. http.HandleFunc("/", ExampleHandler)
  8. if err := http.ListenAndServe(":8080", nil); err != nil {
  9. panic(err)
  10. }
  11. }
  12. func ExampleHandler(w http.ResponseWriter, r *http.Request) {
  13. w.Header().Add("Content-Type", "application/json")
  14. resp, _ := json.Marshal(map[string]string{
  15. "ip": GetIP(r),
  16. })
  17. w.Write(resp)
  18. }
  19. // GetIP gets a requests IP address by reading off the forwarded-for
  20. // header (for proxies) and falls back to use the remote address.
  21. func GetIP(r *http.Request) string {
  22. forwarded := r.Header.Get("X-FORWARDED-FOR")
  23. if forwarded != "" {
  24. return forwarded
  25. }
  26. return r.RemoteAddr
  27. }