问候,

如何关闭在红宝石ETag的(一个或多个)上的Rails V2.3.5

当我做的直接请求向回报率/ Mongrel的一个ETag报头是否存在。

TIA,

-daniel

有帮助吗?

解决方案

更容易:

config.middleware.delete Rack::ETag

其他提示

response.etag = nil在的before_filter不起作用。生成的eTag之前的响应发送(它是从身体caluculated所以毕竟渲染已完成)。

在适当的解决方法,以禁用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

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

response.etag = nil

我不认为他们是在默认情况下。

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

我在使用WEBrick Rails的4个工作,试图让缓存,直到它在特定的时间,每天到期的响应。它看起来像自动生成的ETag与到期缓存这就是为什么我寻找这个答案的干扰。我没有发现任何有用的在这里,但我没有解决我的问题,所以我将分享。

TL;博士设置Last-Modified

但它设置的是什么?在我的情况,我试图以优化返回在每天的同一时间运行的进程的结果的web服务。我的响应头结束了寻找这样的:

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

首先要明确写入Cache-Control头覆盖任何默认为。我设置矿为24小时,以具有最大我的过期标头的重合。我设定的函数的过期标头看起来像这样:

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的(另一验证缓存头)在我目前的开发环境。

为什么不能在你的应用程序控制器添加的before_filter这台ETAG到零?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top