Rails - 如何获取访问者的IP地址?

时间:2013-10-11 11:39:15

标签: ruby-on-rails ruby request ip

我需要将访问者的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 个答案:

答案 0 :(得分:19)

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

您正在做的是访问者IP地址的正确方法,您看到的结果符合预期。

您想要使用

@ip = request.remote_ip

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

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

示例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;

答案 1 :(得分:1)

  

x-forward-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地址。

答案 2 :(得分:0)

使用命令获取客户端IP:

request.remote_ip

答案 3 :(得分:0)

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

通常,Stack Overflow不喜欢只是链接的答案,但是在这种情况下,由于问题很老,我们没有回答特定问题的详细信息,并且因为AWS提供了负载均衡器的种类以及配置它们的方式不断变化,我将发布一个指向AWS Knowledge Base instructions的链接,以通过负载平衡器转发客户端IP地址。

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

@Jakob S correctly explains如何配置nginx以传递X-Forwarded-For标头,该标头是当前的事实上的标准,但是{​​{1} }前缀表示根据相关HTTP规范,它显然是非标准的。最终,您可能希望支持Forwarded中指定的RFC 7239标头,但截至目前(2019年1月),由于缺乏广泛的支持,它尚未被广泛采用,因此不值得切换