Ruby 应用程序认为客户端的 IP 地址始终相同

lak*_*are 0 ip heroku sinatra

Sinatra 应用程序。

<%= request.ip %>
Run Code Online (Sandbox Code Playgroud)

如果从本地服务器查看,会给出127.0.0.1 IP 地址。如果从 Heroku 服务器查看,无论来自哪个设备,
都会给出83.245.226.68 IP 地址。
所以我猜它返回服务器的 IP 地址而不是客户端的。那么我如何找出客户端的IP地址呢?我误解了request.ip方法吗?

mad*_*ode 5

当 Rack HTTP Server 前面的 HTTP Server(例如用于负载平衡、ssl 等)没有将客户端 IP 地址转发到 Rack HTTP Server 时,就会发生这种情况。在这种情况下,您将获得 HTTP 服务器的 IP 地址。

这可以在像 Nginx 和 Apache 这样的 HTTP 服务器上配置,你可以在request.ip.

据我所知,Heroku 的处理方式是客户端 IP 地址位于名为“x-forwarded-for”的标头中,这是一个逗号分隔的 IP 地址列表,最后一个元素是客户端 IP。

辛纳特拉:

env['HTTP_X_FORWARDED_FOR'].split(',').last
Run Code Online (Sandbox Code Playgroud)

导轨:

request.headers['x-forwarded-for'].split(',').last
Run Code Online (Sandbox Code Playgroud)