Ruby on Rails的,如何禁用/关闭的ETag
-
21-09-2019 - |
题
问候,
如何关闭在红宝石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到零?