タイトルにあるように、両方の方法でクライアントのIPを取得できます。違いはあるのでしょうか。ありがとうございました。
ソースコードには
「/usr/local/rvm/gems/Ruby-1.9.3-p194/gems/actionpack-3.2.3/lib/action _dispatch/http/request.rb」257L、8741C
def ip
@ip ||= super
end
# Originating IP address, usually set by the RemoteIp middleware.
def remote_ip
@remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end
しかし、私は本当にその意味を知りません。
ソースから:
module ActionDispatch
class Request < Rack::Request
# ...
def ip
@ip ||= super
end
def remote_ip
@remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end
# ...
end
end
rack :: Requestは次のようになります
module Rack
class Request
def ip
remote_addrs = split_ip_addresses(@env['REMOTE_ADDR'])
remote_addrs = reject_trusted_ip_addresses(remote_addrs)
return remote_addrs.first if remote_addrs.any?
forwarded_ips = split_ip_addresses(@env['HTTP_X_FORWARDED_FOR'])
if client_ip = @env['HTTP_CLIENT_IP']
# If forwarded_ips doesn't include the client_ip, it might be an
# ip spoofing attempt, so we ignore HTTP_CLIENT_IP
return client_ip if forwarded_ips.include?(client_ip)
end
return reject_trusted_ip_addresses(forwarded_ips).last || @env["REMOTE_ADDR"]
end
end
end
したがって、remote_ip
はaction_dispatch.remote_ip
を優先します。それはActionDispatch::RemoteIp
ミドルウェアによって設定されています。そのミドルウェアのソースでは、GetIp.new
を呼び出してそのenv変数を設定しているため、呼び出されたときにスプーフィング攻撃をチェックしていることがわかります。 Clowerwebが説明しているように、remote_ip
はローカルプロキシ経由でもIPアドレスを読み取るため、これが必要です。
request.ip
は、クライアントがプロキシであっても、クライアントip
を返します。
request.remote_ip
はより賢く、実際のクライアントip
を取得します。これは、途中のすべてのプロキシが X-Forwarded-For ヘッダーを設定した場合にのみ実行できます。