一、問(wèn)題描述
http.Request 下的方法RemoteAddr() 可以獲取客戶端的地址和端口號(hào),最近的一個(gè)項(xiàng)目中用到了這個(gè)方法。
使用過(guò)程中一直都沒(méi)有什么問(wèn)題,但是當(dāng)項(xiàng)目上線之后就發(fā)現(xiàn)不管怎么獲取ip,客戶端地址都是127.0.0.1 。
對(duì)于這個(gè)問(wèn)題一直百思不得其解,最后搞了半天才發(fā)現(xiàn)是nginx 的原因。
因?yàn)榫€上項(xiàng)目使用nginx做了反向代理,所以導(dǎo)致服務(wù)端每次獲取的都是nginx的地址,即127.0.0.1 。
關(guān)于這個(gè)問(wèn)題的具體的內(nèi)容可以查看:HTTP協(xié)議中的X-Real-IP, X-Forwarded-For和remote_addr頭
二、解決方法
當(dāng)http請(qǐng)求不存在代理的時(shí)候,使用這個(gè)方法時(shí)沒(méi)有問(wèn)題的,但是在有代理的情況下,就只能通過(guò)其他的方法來(lái)獲取了。
如果是nginx ,可以在代理的代碼塊加上以下代碼:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-808883.html
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轉(zhuǎn)發(fā)前把真實(shí)地址設(shè)置到X-Real-IP 和X-Forwarded-For 兩個(gè)請(qǐng)求頭上,然后根據(jù)需要再?gòu)乃鼈兊闹但@取。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-808883.html
func getCurrentIP(r http.Request)(string){
// 這里也可以通過(guò)X-Forwarded-For請(qǐng)求頭的第一個(gè)值作為用戶的ip
// 但是要注意的是這兩個(gè)請(qǐng)求頭代表的ip都有可能是偽造的
ip := r.Header.Get("X-Real-IP")
if ip == ""{
// 當(dāng)請(qǐng)求頭不存在即不存在代理時(shí)直接獲取ip
ip = strings.Split(r.RemoteAddr, ":")[0]
}
return ip
}
到了這里,關(guān)于Go新項(xiàng)目-Golang使用RemoteAddr()獲取遠(yuǎn)程主機(jī)地址的注意事項(xiàng)(9)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!