Rails 3 当前将 HEAD 请求路由到匹配的 GET 路由。有头吗?请求上的方法,但返回 false 并且请求的行为类似于获取请求。我可以检测请求是否是 HEAD 请求吗?
推理:我知道一个 HEAD 请求应该返回与 get 完全相同的 headers,所以 Rails 想要执行完整的 GET 然后剃掉正文。但是,我可以在不发出与 GET 相同的数据库调用等的情况下遵守此请求。这有意义吗?
Rails 3 当前将 HEAD 请求路由到匹配的 GET 路由。有头吗?请求上的方法,但返回 false 并且请求的行为类似于获取请求。我可以检测请求是否是 HEAD 请求吗?
推理:我知道一个 HEAD 请求应该返回与 get 完全相同的 headers,所以 Rails 想要执行完整的 GET 然后剃掉正文。但是,我可以在不发出与 GET 相同的数据库调用等的情况下遵守此请求。这有意义吗?
我有这个确切的问题。事实证明,启用缓存会导致这种情况。在您的环境和#head 中关闭缓存?将按预期工作。
问题是 Rack::Cache 将 HEAD 请求转换为 GET 请求,因此它们可以被缓存。这可以说是正确的行为,但它干扰了我的应用程序。
你可以使用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'
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.