Go新项目-Golang使用RemoteAddr()获取远程主机地址的注意事项(9)

一、问题描述

http.Request 下的方法RemoteAddr() 可以获取客户端的地址和端口号,最近的一个项目中用到了这个方法。

使用过程中一直都没有什么问题,但是当项目上线之后就发现不管怎么获取ip,客户端地址都是127.0.0.1 。

对于这个问题一直百思不得其解,最后搞了半天才发现是nginx 的原因。

因为线上项目使用nginx做了反向代理,所以导致服务端每次获取的都是nginx的地址,即127.0.0.1 。

关于这个问题的具体的内容可以查看:HTTP协议中的X-Real-IP, X-Forwarded-For和remote_addr头

二、解决方法

当http请求不存在代理的时候,使用这个方法时没有问题的,但是在有代理的情况下,就只能通过其他的方法来获取了。

如果是nginx ,可以在代理的代码块加上以下代码:

goland 复制代码
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-IP 和X-Forwarded-For 两个请求头上,然后根据需要再从它们的值获取。

goland 复制代码
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
}
相关推荐
小白说大模型几秒前
从向量嵌入到复杂 Agent:LLM、LangChain、LangGraph 完整科普
java·开发语言·人工智能·gpt·深度学习·langchain
Conan在掘金8 分钟前
鸿蒙 ArkUI 深水区:Stage 模型多维状态,从「组件内」跳到「应用级」的分水岭
后端
长栎41 分钟前
用AI优化Redis缓存失效,我把热key问题想简单了
后端
面试鸭43 分钟前
我说我们做 Agent 从来不怕死循环,面试官调出兜底日志:“第 47 次强制终止,是你半夜爬起来按停的?”
后端·面试·求职
豆浆D油条43 分钟前
QT容器类QList调用erase崩溃
开发语言·qt·rpc
小小猪的春天43 分钟前
团队级 Code Review Skill 实践:4个人、4个AI、1套规则,CR从找bug变成做决策
后端·架构
长栎1 小时前
AI帮我写了个Spring Boot校验,线上漏掉了这组边界条件
后端
jinyishu_1 小时前
C++ 多态完全指南:从基础语法到底层原理
开发语言·c++·程序人生·面试
外滩运维专家1 小时前
Let's Encrypt 的 ACME 协议到底干了什么?用抓包带你看一遍
后端
程序员多吃鸭eatmoreduck1 小时前
# 开源初体验,39 天 800 Star:我把项目发到了哪里,流量到底从哪来
后端