我需要将访问者的 IP 地址存储到我们的数据库中,这是我尝试执行此操作的方法:
@ip = request.remote_ip
@ip = request.env['REMOTE_ADDR']
但在这两种情况下,@ip
变量存储值127.0.0.1,即使我将应用程序部署到 Amazon EC2 实例。
当我检查时http://www.whatismyip.com/ http://www.whatismyip.com/,它显示我的 IP 为109.175.XXX.X.
那么,为什么 ruby 变量总是显示127.0.0.1地址?如何获取真实IP?
EDIT:这是以下的输出:
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.
我一整天都在解决这个问题,但仍然没有成功。
谢谢
当您访问本地站点时,您来自本地 IP 地址,即 127.0.0.1。
您所做的是获取访问者 IP 地址的正确方法,并且您看到的结果符合预期。
你想使用
@ip = request.remote_ip
因为这考虑了大多数反向代理的情况以及您可能遇到的其他情况request.env['REMOTE_ADDR']
可能为零或本地代理的地址。
如果您的应用程序服务器前面确实有反向代理(您可能确实有),则需要确保它在转发请求时设置正确的标头。至少X-Forwarded-For header http://en.wikipedia.org/wiki/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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)