为什么将HEAD请求转换为GET请求很有用?

时间:2017-01-30 03:24:06

标签: http phoenix-framework endpoint plug

在新的凤凰应用程序中,默认情况下会出现Plug.Head插件,我对它的重要性感到好奇。

我知道" the HEAD method is identical to GET except that the server MUST NOT send a message body in the response"。

我认为official Phoenix guides是一流的,但这让我放弃了Routing guide

  

Plug.Head - 将HEAD请求转换为GET请求并删除   回应机构

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

由于凤凰城很大程度上受到了Rails的启发,你可以放心地Plug.Head受到Rack::Head.

的启发

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

但是要生成正确的(空)体,必须剥离响应的主体。因为Rack::Head是中间件,所以它在从控制器获得响应后就会这样做。

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

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