在 Rails 中,获取连接到服务器的客户端的 IP 地址的最佳方法是什么?
这里有两种我找到的方法:
request.remote_ip
request.env['HTTP_X_REAL_IP']
在 Rails 中,获取连接到服务器的客户端的 IP 地址的最佳方法是什么?
这里有两种我找到的方法:
request.remote_ip
request.env['HTTP_X_REAL_IP']
我会只使用 request.remote_ip
这个简单有效的方法。有没有其他需要另外一个方法的理由呢?
参见:在本地Rails开发环境中获取真实IP地址 了解一些可以通过客户端服务器IP地址执行的其他操作。
request.remote_ip
是对所有可用IP地址信息的解释,并会做出最佳猜测。如果您直接访问变量,则需要负责按正确优先顺序测试它们。代理引入了许多标题,创建具有不同名称的环境变量。
使用命令获取客户端 IP:
request.remote_ip
request.env ['HTTP_X_FORWARDED_FOR']
在request.remote_ip
返回127.0.0.1
的情况下也非常有用。对于使用较新版本Rails和Devise gem的任何人:Devise的“trackable”选项在用户表中包括当前/上次登录IP的列。
来自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