Rails 3中的HEAD HTTP请求

6
Rails 3目前将HEAD请求路由到匹配的GET路由上。虽然请求中有一个head?方法,但它返回false并且请求的行为像一个get请求。我能否检测请求是否是HEAD请求?
原因:我知道HEAD请求应该返回与GET相同的确切标头,因此Rails希望执行完整的GET,然后去掉正文。但是,我可以遵守此请求而不发出与GET相同的DB调用等。这有意义吗?

你可能需要发布一些相关的代码。head? 方法应该对 HEAD 请求返回 true(http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F)。 - rjk
3个回答

4

我遇到了同样的问题,原来是启用缓存导致的。在你的环境中关闭缓存,#head? 就能按预期工作了。

问题在于 Rack::Cache 会将 HEAD 请求转换为 GET 请求以便可以进行缓存。这可能是正确的行为,但它会干扰我的应用。


2

这里有一个要点,包含一些更多信息。你可以看到 HEAD 路由到了我 Rails 的 GET 请求,此时请求表明它是一个 GET 请求。我尝试使用 head?方法,但无法让它指示这是一个 HEAD 请求。 - Glenn Goodrich

1
def index
  if request.head?
    head :created
  else
    Rails.logger.info "Derp #{request.method}"
  end
end

嗯。上述控制器方法在Ruby v1.9.3-p194和Rails v3.2.3上的表现与我预期的一样;对于HEAD请求,返回201且没有响应体,而对于GET请求,返回200且有响应体。


我使用的是1.9.2和Rails 3.1.4版本...我完全有可能做错了什么。我需要进一步调查...谢谢。 - Glenn Goodrich
所以,我认为真正的答案是Rails强制通过处理GET的相同操作来进行HEAD请求,因为它必须生成ETag。如果HEAD执行了不同的操作,它可能会破坏客户端缓存。因此,必须发出确切的调用...我不喜欢无法真正使用head?来知道这是一个HEAD请求,但我(认为我)理解其原因。 - Glenn Goodrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接