我需要将访问者的 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/