Rails: 获取客户端IP地址

192

在 Rails 中,获取连接到服务器的客户端的 IP 地址的最佳方法是什么?

这里有两种我找到的方法:

request.remote_ip
request.env['HTTP_X_REAL_IP']
6个回答

346

我会只使用 request.remote_ip 这个简单有效的方法。有没有其他需要另外一个方法的理由呢?

参见:在本地Rails开发环境中获取真实IP地址 了解一些可以通过客户端服务器IP地址执行的其他操作。


51

request.remote_ip 是对所有可用IP地址信息的解释,并会做出最佳猜测。如果您直接访问变量,则需要负责按正确优先顺序测试它们。代理引入了许多标题,创建具有不同名称的环境变量。


11

使用命令获取客户端 IP:

request.remote_ip

4
我发现request.env ['HTTP_X_FORWARDED_FOR']request.remote_ip返回127.0.0.1的情况下也非常有用。

2

对于使用较新版本Rails和Devise gem的任何人:Devise的“trackable”选项在用户表中包括当前/上次登录IP的列。


0

来自Mozilla文档:

当客户端直接连接服务器时,客户端的IP地址会发送到服务器(并经常写入服务器访问日志)。但是如果客户端连接通过任何转发或反向代理,则服务器只能看到最终代理的IP地址,这通常没有什么用。特别是如果最终代理是与服务器相同安装的负载均衡器。因此,为了向服务器提供更有用的客户端IP地址,使用X-Forwarded-For请求头。

remote_ip实际上会检查传递的一些标头。这包括REMOTE_ADDR和X-Forwarded-For。在代理的情况下,使用X-Forwarded-For。但REMOTE_ADDR首先被检查。您可以在rspec测试中验证这一点:

describe CustomersController, type: :controller do
  describe "GET search" do
    it "returns a 200" do
      whitelisted_ip = '73.1.193.230' # a comcast ip address
      request.headers['REMOTE_ADDR'] = whitelisted_ip
      request.headers['X-Forwarded-For'] = whitelisted_ip
      get :index
      expect(response).to have_http_status(:ok)
    end
  end
end

在控制器内部:

before_action :verify_source_ip, only: [:index]

def verify_source_ip
  head(403) unless request.remote_ip == '73.1.193.230'
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接