【问题标题】:How to get client IP in Phoenix rest api如何在 Phoenix rest api 中获取客户端 IP
【发布时间】:2017-01-05 02:38:13
【问题描述】:

我在 Elixir Phoenix 中有休息 API,我想记录每个请求者客户端 IP。目前,我正在使用以下代码获取客户端 IP:

conn.remote_ip |> Tuple.to_list |> Enum.join(".")

但是,它给了我本地 IP 127.0.0.1

然后,我使用了以下代码:

remote_ips = Plug.Conn.get_req_header(conn, "x-forwarded-for")
remote_ip = List.first(remote_ips)

它给了 nil x-forwarded-for

请帮我解决这个问题。

【问题讨论】:

  • 您是否在其他服务器(如 nginx 或 varnish 或其他任何服务器)后面运行应用程序?
  • 是的,在 nginx 上运行。
  • 能否请您包含用于将流量路由到 Phoenix 应用程序的 nginx 配置?
  • proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60s;
  • 你打错了X-Forwared-For -> X-Forwarded-For

标签: elixir phoenix-framework


【解决方案1】:

上述解决方案有效,但我也遇到了这个问题,我找到了非常复杂的解决方案,但是我检查了 Plausible Analytics 是如何做到的,就在这里。

来自似是而非的分析的源代码:

defmodule MyAppWeb.RemoteIp do
  def get(conn) do
    forwarded_for = List.first(Plug.Conn.get_req_header(conn, "x-forwarded-for"))

    if forwarded_for do
      String.split(forwarded_for, ",")
      |> Enum.map(&String.trim/1)
      |> List.first()
    else
      to_string(:inet_parse.ntoa(conn.remote_ip))
    end
  end
end

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多