Golang 使用 RemoteAddr() 获取远程主机地址的注意事项

马谦马谦马谦 Golang评论3,0994字数 483阅读 1 分 36 秒阅读模式

一、问题描述

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,可以在代理的代码块加上以下代码:

在 nginx 转发前把真实地址设置到 X-Real-IPX-Forwarded-For 两个请求头上,然后根据需要再从它们的值获取。

 
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2018 年 1 月 18 日 21:38:06
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/golang/golang-http-request-remote-addr-questions.html
HTTP/2简介 计算机网络

HTTP/2 简介

一、 HTTP/2 概述 HTTP/2 是 HTTP 协议的第二个大版本,相较于 HTTP/1 而言,HTTP/2 的核心观念是 「构建一个更快、更简单以及更强大」 的 web 应用。 HTTP/2 will make ou...
HTTP协议中的keep-alive机制 计算机网络

HTTP 协议中的 keep-alive 机制

一、长连接和短连接 长连接和短链接的概念: 短连接:传输完数据后连接立刻关闭。 长连接:传输完数据后不会立刻关闭连接,下次传输数据继续复用这个连接。 很容易看出,长连接和短连接的主要区别就是连接完成后...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证