1

我正在使用能够从 http 请求中获取 IP 地址的地理编码器 gem。从文档中:

Geocoder adds a +location+ method to the standard <tt>Rack::Request</tt> object so you can easily look up the location of any HTTP request by IP address. For example, in a Rails controller or a Sinatra app:

 # returns Geocoder::Result object
  result = request.location

我放

@result = request.location

在我的控制器中,然后在我的视图中

<%= @result %>

然而,我得到了这个。

#<Geocoder::Result::Freegeoip:0x00000102dc7758>

然后我尝试了

<%= @result.to_s %>

但它没有改变任何东西。

有任何想法吗?

4

2 回答 2

3

要获取客户端的 IP,请使用request.ip. 这是获取 IP 的更正确方法,尤其是当您的用户位于代理之后时。所以,这很简单:

 request.ip

这是它的来源:

 # File lib/rack/request.rb, line 256
 def ip
   if addr = @env['HTTP_X_FORWARDED_FOR']
     (addr.split(',').grep(/\d\./).first || @env['REMOTE_ADDR']).to_s.strip
   else
     @env['REMOTE_ADDR']
   end
 end
于 2012-04-28T05:05:17.617 回答
0

如果您只需要一个 IP 地址,那么您可以从请求标头中获取它。由于欺骗,它可能并不完全准确,但通过快速查看一些标头值,我发现 REMOTE_ADDR 包含我的。只需将其放入控制器中即可。如果其他人可以推荐其他或更好的值来使用,请告诉我们。

request.headers['REMOTE_ADDR']

我实际上尝试检查 HTTP_X_FORWARDED_FOR,但它在标头中不存在。也许 webrick 不使用它。

于 2012-04-28T03:54:21.390 回答