在Sinatra中获取客户端的IP地址?

39

这是一个非常简单的问题,但是我无法在任何地方找到关于它的提及。

在Sinatra中,我如何获取客户端的IP地址?

get '/' do
    "Your IP address is #{....}"
end

1
哦,原来是在@env['REMOTE_ADDR']里面 - 我之前通过搜索"127.0.0.1"来检查@env.inspect的输出结果,但它显示的是IPv6的::1地址,所以我错过了... 如果有人愿意回复这个问题,那么我就可以立即接受它,不用等待48小时了...(免费声望!:P) - dbr
2个回答

75

Sinatra提供了一个request对象,它是与客户端请求数据交互的接口,你应该使用它。

使用request.ip是查找客户端IP地址的首选方法:

get '/' do
  "Your IP address is #{request.ip}"
end

3
需要注意的是,Request#ip 方法来自 Rack 而不是 Sinatra。 - skalee

18

我本来就要来发布答案了,所以:

get '/' do
"Your IP address is #{ @env['REMOTE_ADDR'] }"
end

Sinatra使用Rack::Request API,因此您可以使用其中许多可用的内容。
同时提供Sinatra文档的链接。


2
嗯,Rack::Request API提到了一个ip方法,它也处理HTTP_X_FORWARDED_FOR,有没有办法从Sinatra中调用它? - dbr
1
你应该可以只做 #{ @env['HTTP_X_FORWARDED_FOR'] }。不过我从未测试过,所以不能确定。 - Brian Gianforcaro
7
你可以直接使用 request.ip。在根路径 "/" 上,返回 "your IP: #{request.ip}"。 - bantic
2
请看:https://github.com/chneukirchen/rack/blob/master/lib/rack/request.rb#L315 ... 这里采用的方法非常冒险。 - Sam Saffron

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