20

我需要将访问者的 IP 地址存储到我们的数据库中,这就是我尝试这样做的方式:

@ip = request.remote_ip
@ip = request.env['REMOTE_ADDR']

但在这两种情况下,@ip变量都存储了值127.0.0.1,即使我将应用程序部署到 Amazon EC2 实例也是如此。

当我检查http://www.whatismyip.com/时,它显示我的 IP 为109.175.XXX.X

因此,为什么 ruby​​ 变量总是显示127.0.0.1地址?如何获取真实IP?


编辑: 这是以下输出:

request.env['HTTP_X_FORWARDED_FOR'] => 
request.remote_ip => 127.0.0.1
request.env['REMOTE_ADDR'] => 127.0.0.1
request.ip => 127.0.0.1

我以为问题出在我这边,但我向我的 3 个朋友发送了链接,他们都看到相同的 IP,只是127.0.0.1

我整天都在解决这个问题,但仍然没有成功。

谢谢

4

4 回答 4

24

当您访问本地站点时,您来自本地 IP 地址,即 127.0.0.1。

您所做的是访问访问者 IP 地址的正确方法,并且您看到的结果与预期的一样。

你想用

@ip = request.remote_ip

因为这考虑了大多数反向代理情况以及您可能遇到的其他情况,其中request.env['REMOTE_ADDR']可能是 nil 或本地代理的地址。

如果您的应用程序服务器前确实有一个反向代理(并且您可能有),您需要确保它在转发请求时设置了正确的标头。至少应设置X-Forwarded-For标题。

示例 nginx 配置

如果您在 Rails 应用程序前使用 nginx 作为反向代理(即使用proxy_pass),则需要对其进行配置以将正确的标头添加到它发送的请求中。在这种情况下X-Forwarded-For,使用:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

您可能还需要配置以下内容以让 nginx 转发请求的主机名和协议:

# enable this if you forward HTTPS traffic to Rails,
# this helps Rack set the proper URL scheme for doing redirects:
proxy_set_header X-Forwarded-Proto $scheme;

# pass the Host: header from the client right along so redirects
# can be set properly within the Rack application
proxy_set_header Host $http_host;
于 2013-10-11T12:06:00.840 回答
6

x-转发-for。x-forwarded-for (XFF) 是一个标准代理标头,它指示请求在从客户端到服务器的过程中流经的 IP 地址。

在我的 nginx 服务器配置中,

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

我正在获取客户端远程 IP,如下所示,

request.env['HTTP_X_FORWARDED_FOR'] || request.remote_ip

注意:如果客户端位于代理后面,则可能是错误的 IP 地址。

于 2019-01-31T06:11:12.347 回答
1

使用命令获取客户端 ip:

request.remote_ip
于 2019-01-30T11:02:51.570 回答
0

请注意,如果您将 AWS 与他们提供的任何负载均衡器一起使用,您可能必须适当地配置这些负载均衡器才能让它们转发客户端 IP。

通常 Stack Overflow 不喜欢只是一个链接的答案,但在这种情况下,由于问题很老,我们没有详细回答具体问题,而且因为 AWS 提供的负载均衡器类型和配置方式它们不断变化,我将发布一个指向AWS 知识库说明的链接,以通过负载均衡器转发客户端 IP 地址。

如果您使用内容交付网络 (CDN) 来交付数据,您可能会遇到类似的问题,在这种情况下,您需要联系您的 CDN 提供商以获取说明。

@Jakob S正确解释了如何配置nginx以传递X-Forwarded-For标头,这是当前事实上的标准,但X-前缀意味着它在相关 HTTP 规范下明确非标准。最终,您可能希望支持标头,该标头在RFC 7239Forwarded中指定,但截至目前(2019 年 1 月),它尚未被广泛采用,由于缺乏广泛支持,不值得切换。

于 2019-01-30T22:50:18.337 回答