我正在尝试在 Rails 3 中获取客户端 IP。应用程序安装在云主机中,带有 SSL 和 nginx 服务器。
我写了一些代码来获取客户端IP。
request.remote_ip
request.env['HTTP_X_FORWARDED_FOR']
但它返回错误的地址,例如 '10.159.21.86' 是否有任何与 Nginx 服务器或 SSL 安装相关的问题?
我正在尝试在 Rails 3 中获取客户端 IP。应用程序安装在云主机中,带有 SSL 和 nginx 服务器。
我写了一些代码来获取客户端IP。
request.remote_ip
request.env['HTTP_X_FORWARDED_FOR']
但它返回错误的地址,例如 '10.159.21.86' 是否有任何与 Nginx 服务器或 SSL 安装相关的问题?
如果您将 SSL 与 HAProxy 一起使用(多实例环境的默认配置),那么由于从 HAProxy 到 Nginx 的切换,它将无法提取远程 IP。我们有一个使用 stunnel 来解决这个问题的解决方案,但是由于所有 SSL 解密都是在 App Master 实例上完成的,如果您有超过大约五个实例,那么性能将会受到影响。
另一种选择是使用弹性负载均衡器而不是 HAProxy。相关文档位于https://support.cloud.engineyard.com/entries/21715452-Use-Elastic-Load-Balancing-with-Engine-Yard-Cloud。
埃文
我相信您遇到的问题与以下 Engine Yard 支持请求中描述的相同:HAProxy, SSL Requests & Request IP Addresses。
显然有一种解决方法,但您应该直接与他们联系以了解它是什么。
文档团队正在编写正式文档,短期内,请开票,支持工程师可以提供帮助。
def remote_ip
@remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end
request.remote_ip
在本地代理之外获取客户端的 IP 地址但是如果您的请求来自您的开发机器并且开发机器是您的服务器所在的位置,那么您可能会得到 127.0.0.1 或错误的 IP 但是如果请求来自另一台机器,这将是远程机器的 IP。但是,在各种情况下,这可能不是机器的真实 IP(代理后面的机器,使用 tor 或其他工具隐藏它等)。所以你也可以尝试:-
request.env['REMOTE_ADDR']
您应该访问由 rails 贡献者撰写的这篇文章,描述重复标头和 Ruby Web 服务器