Ruby on Rails,如何禁用/关闭ETag

时间:2010-01-19 00:17:43

标签: ruby-on-rails http etag

问候,

如何在Ruby on Rails v2.3.5中关闭ETag

当我直接向RoR / Mongrel请求时,会出现一个ETag标题。

TIA,

-daniel

6 个答案:

答案 0 :(得分:21)

更容易:

config.middleware.delete Rack::ETag

答案 1 :(得分:5)

response.etag = nil放在before_filter中不起作用。 etag是在发送响应之前生成的(它是从主体计算出来的,所以在完成所有渲染之后)。

正确的解决方法是禁用etag使用和生成(以节省md5中的时间)这个猴子补丁:

module ActionController
  class Request
    # never match any incomming etag
    def etag_matches?(etag)
      false
    end
  end

  class Response
    # fake rails that our response already has an etag set and so none is generated automatically
    def etag?
      true
    end
  end
end

答案 2 :(得分:1)

ActionController::Response对象上有一个etag setter方法,如果它是空白的,它会删除ETag HTTP标头,所以你应该只能在控制器中清除它(可能在之前的过滤器中) :

response.etag = nil

答案 3 :(得分:0)

我不认为默认情况下它们已开启。

我的理解是他们需要使用陈旧的?/ fresh_when调用或类似的方式明确设置。

答案 4 :(得分:0)

我在WEBrick上的Rails 4中工作,尝试获取缓存响应,直到它在每天的特定时间到期。看起来自动生成的ETag正在干扰到期缓存,这就是我搜索这个答案的原因。我在这里找不到任何有用的东西,但我确实解决了我的问题,所以我会分享。

tl; dr设置Last-Modified标题

但是把它设定为什么?在我的情况下,我试图优化一个Web服务,它返回每天在同一时间运行的进程的结果。我的回复标题最终看起来像这样:

response.headers['Cache-Control'] = "max-age=86400"
response.headers['Expires'] = getCacheTime
response.headers['Last-Modified'] = getLastModified

首先,您要显式写入Cache-Control标头以覆盖默认值。我将我的设置为24小时,以符合我的到期标头的最大值。我用一个看起来像这样的函数设置了expiration头:

def getCacheTime
    now = Time.now.utc
    cacheTime = Time.utc(now.year, now.month, now.day, 22, 00, 00)
    if now > cacheTime
        cacheTime = cacheTime + (60 * 60 * 24)
    end

    cacheTime.httpdate
end

getLastModified 函数返回的时间比 getCacheTime 函数少24小时。似乎设置它将至少在我当前的开发环境中抑制ETag(另一个验证缓存头)。

答案 5 :(得分:-1)

为什么不在应用程序控制器中添加一个将etag设置为nil的before_filter?