我需要将访问者的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 。
我整天都在解决这个问题但仍然没有成功。
谢谢
答案 0 :(得分:19)
当您在本地访问某个站点时,您来自本地IP地址,即127.0.0.1。
您正在做的是访问者IP地址的正确方法,您看到的结果符合预期。
您想要使用
@ip = request.remote_ip
因为这考虑了大多数反向代理和其他情况,您可能会遇到request.env['REMOTE_ADDR']
可能为零或本地代理的地址。
如果您确实在应用程序服务器前面有一个反向代理(并且您可能已经这样做),则需要确保在转发请求时设置正确的标头。至少应设置X-Forwarded-For
header。
如果您在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月),由于缺乏广泛的支持,它尚未被广泛采用,因此不值得切换