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

标签 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 个 friend 发送了链接,他们都看到了相同的 IP,只是 127.0.0.1

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

谢谢

最佳答案

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

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

你想用

@ip = request.remote_ip

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

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

示例 nginx 配置

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

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

您可能还想配置以下内容以使 nginx 转发请求的主机名和协议(protocol):

# 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;

关于ruby-on-rails - Rails - 如何获取访问者的IP地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19317255/

相关文章:

ruby-on-rails - 托管高流量的 Facebook 应用程序(游戏)

ruby-on-rails - 这种关键字在 Ruby 中有什么作用?

node.js - 如何显示适合我的时区的时间和日期?

javascript - 如何解码诺克记录的响应

javascript - 如何将 ruby​​ 嵌入到 JavaScript 中

ruby-on-rails - ActiveAdmin Rails 4 NoMenuError

ruby-on-rails - Rails 中至少有 2 个 DateTime?

ruby-on-rails - Rails 4 中的联系表格邮件程序

用于迭代 css 类的 javascript 阅读更多链接工作

用于 HTTP 请求的 C++ 库 - XML、JSON、CSV