ruby-on-rails Rails:获取客户端IP地址

mrphzbgm  于 2022-11-19  发布在  Ruby
关注(0)|答案(6)|浏览(183)

在Rails中,获取连接到服务器的客户机的ip地址的最佳方法是什么?
我发现了两种方法:

request.remote_ip
request.env['HTTP_X_REAL_IP']
wribegjk

wribegjk1#

我会使用request.remote_ip,它很简单,也很好用。有什么理由需要其他方法吗?
请参阅:Get real IP address in local Rails development environment以了解您可以使用客户端服务器ip执行的其他操作。

cpjpxq1n

cpjpxq1n2#

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

mwg9r5ms

mwg9r5ms3#

使用以下命令获取客户端IP:

request.remote_ip
4dbbbstv

4dbbbstv4#

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

t2a7ltrp

t2a7ltrp5#

对于任何有兴趣并使用更新的rails和Devise gem的人:Devise的“trackable”选项在用户表中包含一个用于当前/最后一个登录IP的列。

xytpbqjk

xytpbqjk6#

从Mozilla文件:
当客户端直接连接到服务器时,客户端的IP地址将发送到服务器(通常会写入服务器访问日志)。但是,如果客户端连接通过任何正向或反向代理,服务器只能看到最终代理的IP地址,这通常没有什么用处。如果最终代理是负载平衡器,并且与服务器属于同一个安装,则情况尤其如此。因此,为了向服务器提供更有用的客户端IP地址,使用了X-Forwarded-For请求报头。
remote_ip实际上会检查一些传入的头文件。这包括REMOTE_ADDRX-Forwarded-ForX-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

相关问题