6

Rails 3 当前将 HEAD 请求路由到匹配的 GET 路由。有头吗?请求上的方法,但返回 false 并且请求的行为类似于获取请求。我可以检测请求是否是 HEAD 请求吗?

推理:我知道一个 HEAD 请求应该返回与 get 完全相同的 headers,所以 Rails 想要执行完整的 GET 然后剃掉正文。但是,我可以在不发出与 GET 相同的数据库调用等的情况下遵守此请求。这有意义吗?

4

3 回答 3

4

我有这个确切的问题。事实证明,启用缓存会导致这种情况。在您的环境和#head 中关闭缓存?将按预期工作。

问题是 Rack::Cache 将 HEAD 请求转换为 GET 请求,因此它们可以被缓存。这可以说是正确的行为,但它干扰了我的应用程序。

于 2013-10-25T23:41:18.843 回答
2

你可以使用request.head吗?判断它是否是 HEAD 请求的方法:

http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F

一旦你确定它是,你也可以使用控制器的 head() 方法而不是典型的渲染:

http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses

所以我只需检查 request.head?在打扰数据库活动之前。然后使用

head :ok, :custom_header => 'value'
于 2012-05-03T20:53:46.313 回答
1
def index
  if request.head?
    head :created
  else
    Rails.logger.info "Derp #{request.method}"
  end
end

Hmm. The above controller method works like I'd expect on Ruby v1.9.3-p194 and Rails v3.2.3; 201's w/o response body for the HEAD requests and 200's w/ for the GET's.

于 2012-05-04T17:33:33.730 回答