5

在一个新的 Phoenix 应用程序中,该Plug.Head插件默认存在,我对它的重要性很感兴趣。

我知道“ HEAD 方法与 GET 相同,只是服务器不得在响应中发送消息正文”。

我认为凤凰城的官方指南是一流的,但这让我在路由指南中感到失望:

Plug.Head - 将 HEAD 请求转换为 GET 请求并剥离响应正文

如果 HEAD 请求没有正文,那么为什么需要这样做?我想也许可以控制格式错误的请求,但查看Plug.Head 实现,它只是将 HEAD 方法切换为 GET。

  def call(%Conn{method: "HEAD"} = conn, []), do: %{conn | method: "GET"}
  def call(conn, []), do: conn
end

我能在这个主题上找到的最接近的东西是关于 ServerFault 的问题,但它与 NGINX 和一个有缺陷的应用程序逻辑有关,其中 HEAD 请求需要转换为 GET 并将相应的 GET 响应返回给 HEAD。

4

2 回答 2

3

由于 Phoenix 在很大程度上受到 Rails 的启发,因此您可以放心地打赌Plug.Head,灵感来自Rack::Head.

HEAD 请求返回与 GET 相同的响应,但仅包含标头。因此,要生成正确的标头,它们会被路由到您的 Phoenix 应用程序中的 GET 操作。

但是,要生成正确的(空)正文,必须剥离响应的正文。因为Rack::Head是中间件,它在得到控制器的响应后才会这样做。

相比之下,Plug 的架构更像是一个管道,Plug.Head修改方法并传递conn,但再也看不到它了。

如果您看到cdegroot 的回答,则剥离响应正文的责任将传递给Plug.Conn.Adapter实现(即网络服务器)。

于 2017-02-04T16:23:21.267 回答
2

AFAICT,这个想法是Plug.Head确保请求被处理为GET; 实现的第二部分,HEAD不发送正文,由 Plug 连接适配器完成。大多数回调的文档,如send_resp,指定“如果请求具有方法"HEAD",则适配器不应将响应发送到客户端。”

于 2017-02-04T15:00:38.727 回答