问题 Rails - 如何获取访问者的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

我认为这个问题就在我身边,但是我发送了三个朋友的链接,所有人都看到了相同的IP,只是 127.0.0.1

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

谢谢


4669
2017-10-11 11:39


起源

也许你的应用程序落后于 反向代理 ? - m_x
“访客”如何访问您的服务器?当您使用EC2实例时,如何将请求发送到服务器? - Makis Tsantekidis
简单地说,我已经在浏览器中打开了我的网站并重新加载了页面,因为我想看到更改的IP - 但仍然与localhost上的那个相同 - 127.0.0.1 - user984621


答案:


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

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

你想用

@ip = request.remote_ip

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

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


14
2017-10-11 12:06



谢谢您的回复。但事实是,我仍然不明白为什么我会收到 127.0.0.1 在Amazon EC2上。我也试过它 request.remote_ip 命令。为什么显示EC2上的生产模式 127.0.0.1 代替 109.175.XXX.X? - user984621
不知道你的设置,很难说。很可能你正在点击一些代理网络服务器,通过(Unicorn,Thin,Webrick)将请求转发给你正在服务Rails的任何东西。该代理是您的应用的本地代理,如果它没有设置预期的标头,request.remote_ip将不会获取原始IP。 - Jakob S
它有帮助,我在Unicorn上运行。 (我不知道代理) - user984621
所以你直接进入Unicorn流程?你在哪里没有Apache或Nginx?或者也许某些亚马逊负载均衡器? - Jakob S