Golang使用RemoteAddr()擷取遠程主機地址的注意事項

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

一、問題描述

http.Request 下的方法RemoteAddr() 可以擷取用戶端的地址和連接埠號碼,最近的一個項目中用到了這個方法。

使用過程中一直都沒有什麼問題,但是當項目上線之後就發現不管怎麼擷取ip,用戶端地址都是127.0.0.1

對於這個問題一直百思不得其解,最後搞了半天才發現是nginx 的原因。

因為線上項目使用nginx做了反向 Proxy,所以導致服務端每次擷取的都是nginx的地址,即127.0.0.1

關於這個問題的具體的內容可以查看:HTTP協議中的X-Real-IP, X-Forwarded-For和remote_addr頭

二、解決方案

當http請求不存在代理的時候,使用這個方法時沒有問題的,但是在有代理的情況下,就只能通過其他的方法來擷取了。

如果是nginx ,可以在代理的代碼塊加上以下代碼:

1
2
3
4
5
6
7
location / { 
...
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.234.131;
...
}

在nginx轉寄前把真真實位址設定到X-Real-IPX-Forwarded-For 兩個要求標頭上,然後根據需要再從它們的值擷取。

1
2
3
4
5
6
7
8
9
10
func getCurrentIP(r http.Request)(string){
// 這裡也可以通過X-Forwarded-For要求標頭的第一個值作為使用者的ip
// 但是要注意的是這兩個要求標頭代表的ip都有可能是偽造的
ip := r.Header.Get("X-Real-IP")
if ip == ""{
// 當要求標頭不存在即不存在代理時直接擷取ip
ip = strings.Split(r.RemoteAddr, ":")[0]
}
return ip
}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.