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

Http 为什么将HEAD请求转换为GET请求很有用?,http,phoenix-framework,endpoint,plug,Http,Phoenix Framework,Endpoint,Plug,在新的Phoenix应用程序中,Plug.HeadPlug默认存在,我对它的重要性很感兴趣 我知道 我认为这些都是一流的,但这让我在以下几点上大吃一惊: -将HEAD请求转换为获取请求,并剥离请求 响应体 如果HEAD请求没有主体,那么为什么需要这样做?我想也许可以控制格式不正确的请求,但看看下面的例子,它只是切换了HEAD方法来获取 def call(%Conn{method: "HEAD"} = conn, []), do: %{conn | method: "GET"} def c

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

我知道

我认为这些都是一流的,但这让我在以下几点上大吃一惊:

-将HEAD请求转换为获取请求,并剥离请求 响应体

如果HEAD请求没有主体,那么为什么需要这样做?我想也许可以控制格式不正确的请求,但看看下面的例子,它只是切换了HEAD方法来获取

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

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

AFAICT,其思想是
Plug.HEAD
只确保请求作为
GET
处理;执行
头部
的第二部分(不发送正文)由插头适配器完成。大多数回调的文档,比如,指定“如果请求有方法
”HEAD“
,适配器不应该向客户端发送响应。”

由于Phoenix主要受Rails启发,您可以放心地打赌它是受Rails启发的

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

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

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


如果您看到,剥离响应主体的责任被传递给
Plug.Conn.Adapter
来实现(即Web服务器)。

因此简单的答案是HEAD->GET转换是为了使路由匹配更容易?我用
curl
HEAD和GET请求测试了一个简单的Phoenix应用程序,响应是正确的,日志正确地显示了HEAD请求(尽管这并不奇怪,因为
Plug.Logger
Plug.HEAD
之前)。因此,我猜初始请求方法保留在某个地方,但这将是另一个问题的材料。感谢您指向连接适配器!尽管引用的评论不准确,或者我仍然远离大局,因为我有点错过了“适配器不应该将响应主体发送给客户端”中的“主体”一词。响应独立于请求方法发送,只有主体从对头部的响应中省略。但是,我可能再次误解了适配器的工作原理。评论是正确的。服务器不应发送正文以响应HEAD请求。头部请求本身是否有一个主体是无关紧要的。