【问题标题】:HEAD HTTP requests in Rails 3Rails 3 中的 HEAD HTTP 请求
【发布时间】:2012-05-03 20:42:26
【问题描述】:

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

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

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

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

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

【讨论】:

    【解决方案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'
    

    【讨论】:

    • 所以,这里有一个要点more info 你可以看到 HEAD 被路由到 GET my Rails,此时请求说它是 GET。我尝试了 head?,但无法表明它是 HEAD 请求。
    【解决方案3】:
    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 上所期望的那样工作; 201 的 HEAD 请求的无响应正文和 200 的 GET 请求。

    【讨论】:

    • 我在 1.9.2 和 Rails 3.1.4...我已经做好了做错事的充分准备。我将不得不进一步调查...谢谢。
    • 所以,我认为真正的答案是 Rails 通过处理 GET 的相同操作强制 HEAD 请求是 b/c 它必须生成 ETag。如果 HEAD 做了一些不同的事情,它(可能)会破坏客户端缓存。因此,必须发出确切的呼叫....我不喜欢我真的不能使用 head?知道这是一个 HEAD 请求,但我(认为我)理解其中的原因。
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多