【问题标题】:Get Client IP Address in Rails and Output to View在 Rails 中获取客户端 IP 地址并输出以查看
【发布时间】:2017-10-09 01:44:20
【问题描述】:

在 Ruby on Rails 中,如何获取客户端的 IP 地址?我希望当用户访问某个页面时,Rails 会获取他们的 IP 地址并将其显示在屏幕上。

在我的控制器中我尝试过:

request.remote_ip

但它返回::1,据我所知是IPv6。我想获取客户端的 IPv4 地址。我怎样才能做到这一点?我只需要为每个客户执行一次此操作,因为我只检查他们用来访问我的页面的第一台设备的 IP 地址。

【问题讨论】:

  • IPv6 是要走的路——为什么要改变这个?网络从 IPv4 迁移到 IPv6 是有充分理由的……此外,remote_ip 是(或应该是)最佳猜测方案。在现实世界的通信中,您的应用程序很可能位于代理层(即 nginx 等)之后,并且将根据 HTTP 标头猜测远程 IP 地址。
  • @Myst 在我的环境中,没有使用 IPv6,并且在连接到我们的 VPN 时可能会导致用户出现连接问题。
  • 听起来 IPv4 支持可能是要解决的问题......在家连接的人可能会在他们的 ISP 上使用 IPv6。如果不是今天,那么很快。在我看来,将 IPv4 用于除日志记录以外的任何事情都可能会传播问题……尤其是如果它用于确认 VPN 访问,这会引入有关 HTTP 标头伪造的安全问题。
  • @Myst VPN 有自己的网络适配器,它在其中使用 IPv4。对于任何与工作无关的应用程序,操作系统默认设置的任何内容 (IPv6) 都将优先。我们并没有真正禁用 IPv6。我们只是通过应用程序和 vpn 本身使用 IPv4 优先级。如果有人向我们抱怨他们遇到了网络连接问题(以前发生过),那么取消选中网络适配器中的 IPv6 即可解决此问题。

标签: ruby-on-rails ruby client ip-address ipv6


【解决方案1】:

你可以使用任何一个

  1. request.ip 即返回ip,是否为本地代理ip 地址(本地主机地址)与否。
  2. request.remote_ip更聪明,获取客户端的ip地址 在本地代理之外,这是对所有可用 IP 地址信息的最佳解释,它会做出最佳猜测。

(request.remote_ip) 确定原始 IP 地址。 REMOTE_ADDR 是标准但 如果用户在代理后面,将会失败。 HTTP_CLIENT_IP 和/或 HTTP_X_FORWARDED_FOR 由代理设置,因此请检查这些是否 REMOTE_ADDR 是一个代理。 HTTP_X_FORWARDED_FOR 可能是逗号分隔的 在多个链式代理的情况下列出;最后一个地址 不受信任的是原始 IP。

【讨论】:

    【解决方案2】:

    你确定::1 不够吗?那是本地主机;如果您将站点发布到需要第 3 层传输的任何地方,它应该分别呈现适当的 IPv4 或 IPv6 地址。

    简而言之,如果您禁用本地 IPv6 堆栈 127.0.0.1 将呈现。

    【讨论】:

    • 我将如何禁用 IPv6?我已经取消选中所有网络适配器的网络适配器属性中的复选框。
    • 另外,你真的不应该禁用它,要查看 127.0.0.1 我描述的应该工作需要做很多工作(即只需将应用程序部署到 localhost 以外的其他地方)。
    猜你喜欢
    • 2011-05-26
    • 2019-01-14
    • 2013-11-09
    • 2013-07-07
    • 2019-11-13
    • 1970-01-01
    • 2011-01-08
    • 2014-12-29
    • 2010-09-10
    相关资源
    最近更新 更多