Phoenix从%Plug.Conn {}远程IP解析请求主机

时间:2019-01-18 11:23:50

标签: elixir phoenix-framework hostname

我要做什么的一些摘要。我有一个在AWS Elastic Beanstalk实例上运行的Phoenix应用程序,并且正在发送包含PDF的REST API请求以进行操作(拆分,合并等)。每个请求都保存在数据库中。我的requests模式如下所示:

 schema "requests" do
    field :body, :string
    field :endpoint, :string
    field :method, :string
    field :request_host, :string
    field :response_body, :string
    field :response_code, :integer
    field :work_group_id, :integer
    field :identifier, :string
    field :responded_at, :utc_datetime

    timestamps()
  end

通过Graphql,我从单独的RAILS服务器发出请求,并显示所有请求的主机名,insert_at和response_code

我在尝试解析客户端的主机名时遇到问题。这是我使用的Erlang方法,其中方法参数remote_ip相对为conn.remote_ip

 {:ok, {:hostent, request_host, _, _, _, _}} = :inet.gethostbyaddr(remote_ip)

此方法返回我的Phoenix应用程序的请求主机,而不返回客户端的请求主机。
我在这里做错了什么?
在此先感谢:)

2 个答案:

答案 0 :(得分:1)

docs中所述:

[{remote_ip]字段应由理解例如X-Forwarded-For标头或HAProxy的PROXY协议。默认为对等方的IP。

here上有详细说明:

当您的应用在Nginx之类的代理后面运行时,该请求看起来就像是来自Nginx,即IP为127.0.0.1。同样,如果Nginx位于CDN后面,则所有请求都将来自CDN的IP。

因此,您可以编写一个插件来覆盖remote_ip的{​​{1}}字段。以下是这种插头的示例。此示例是从this blog post复制的。

Plug.Conn

答案 1 :(得分:1)

该库可简化代理后面的IP地址处理。

https://github.com/ajvondrak/remote_ip

作者对适用的用例进行了很好的撰写,以及为什么库可能比滚动自己的库更好的选择:here