use*_*621 14 ruby ip ruby-on-rails request
我需要将访问者的IP地址存储到我们的数据库中,这是我尝试这样做的方式:
@ip = request.remote_ip
@ip = request.env['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,即使我将应用程序部署到Amazon EC2实例,该@ip变量也存储了值127.0.0.1.
当我检查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
Run Code Online (Sandbox Code Playgroud)
我认为问题就在我身边,但我发送了3个朋友的链接,所有人都看到了相同的IP,只有127.0.0.1.
我整天都在解决这个问题但仍然没有成功.
谢谢
Jak*_*b S 19
当您在本地访问某个站点时,您将来自本地IP地址,即127.0.0.1.
你正在做的是访问者IP地址的正确方法,你看到的结果是预期的.
你想用
@ip = request.remote_ip
Run Code Online (Sandbox Code Playgroud)
因为这考虑了大多数反向代理和其他可能遇到的情况,request.env['REMOTE_ADDR']可能是nil或本地代理的地址.
如果您确实在应用程序服务器前面有一个反向代理(并且您可能已经这样做),则需要确保在转发请求时设置正确的标头.至少应该设置X-Forwarded-For标题.
如果您在Rails应用程序(即使用proxy_pass)前面使用nginx作为反向代理,则需要对其进行配置,以便为其发送的请求添加正确的标头.在这种情况下X-Forwarded-For使用:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Run Code Online (Sandbox Code Playgroud)
您可能还希望配置以下内容以使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;
Run Code Online (Sandbox Code Playgroud)
x 转发。x-forwarded-for (XFF) 是一个标准的代理标头,它指示请求在从客户端到服务器的途中流经的 IP 地址。
在我的 nginx 服务器配置中,
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Run Code Online (Sandbox Code Playgroud)
我正在获取客户端远程 IP,如下所示,
request.env['HTTP_X_FORWARDED_FOR'] || request.remote_ip
Run Code Online (Sandbox Code Playgroud)
注意:如果客户端位于代理后面,则可能是错误的 IP 地址。
| 归档时间: |
|
| 查看次数: |
11227 次 |
| 最近记录: |