我们的调查向我们表明,并非所有浏览器都以统一的方式尊重http缓存指令.
出于安全原因,我们不希望在我们的应用程序某些网页缓存,有史以来,通过Web浏览器.这必须至少适用于以下浏览器:
我们的要求来自安全测试.从我们的网站注销后,您可以按后退按钮查看缓存页面.
来自RFC 2616
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
无缓存
如果no-cache指令没有指定字段名,那么缓存绝不能使用响应来满足后续请求,而不能成功地与源服务器重新验证.这允许源服务器甚至通过已配置为返回对客户端请求的陈旧响应的缓存来防止缓存.
因此它指示代理重新验证所有响应.
比较这个
必重新验证
当高速缓存接收到的响应中存在must-revalidate指令时,该高速缓存必须在该条目变为陈旧后才能响应后续请求而不首先使用源服务器重新验证它
因此,它指示代理重新验证陈旧的响应.
特别是关于no-cache,用户代理实际上是如何根据经验处理这个指令的?
什么是点no-cache,如果有must-revalidate和max-age?
看到这个评论:
http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/
无缓存
虽然这个指令听起来像是指示浏览器不缓存页面,但是有一个微妙的区别.根据RFC,"no-cache"指令告诉浏览器它应该在从缓存提供页面之前重新验证服务器.重新验证是一种简洁的技术,可以让应用程序保留带宽.如果浏览器缓存的页面没有更改,则服务器只向浏览器发出信号,并从缓存中显示该页面.因此,浏览器(理论上至少)将页面存储在其缓存中,但仅在与服务器重新验证后才显示该页面.在实践中,IE和Firefox已经开始处理no-cache指令,就像它指示浏览器甚至不缓存页面一样.我们大约一年前开始观察这种行为.我们怀疑这种变化是由于该指令广泛(和不正确)使用以防止缓存而引起的.
有没有人在这方面有更多的官方?
更新
当且仅当无法验证对表示的请求可能导致不正确的操作(例如无声的未执行的金融交易)时,服务器才应使用必须重新验证的指令.
这是我从未想到的事情.RFC表示不要轻易使用must-revalidate.问题是,对于Web服务,您必须采取负面视图并假设您的未知客户端应用程序最糟糕.任何陈旧的资源都有可能导致问题.
我刚才考虑的其他事情,没有Last-Modified或ETags,浏览器只能再次获取整个资源.但是对于ETags,我发现Chrome至少似乎在每次请求时重新验证.这使得这两个指令都没有实际意义或至少命名不佳,因为它们无法正确地重新验证,除非请求还包含其他标题,然后导致"始终重新验证".
我只是想让最后一点更清楚.通过设置must-revalidate但不包括ETag或Last-Modified,代理只能再次获取内容,因为它没有任何内容可以发送到服务器进行比较.
但是,我的经验测试表明,当ETag或修改后的头数据包含在响应中时,代理总是会重新验证,无论是否存在must-revalidate头.
所以点must-revalidate是强制"旁路缓存"时,它会过时,如果当您设置了一生/年龄这只能发生,从而must-revalidate设置上,没有年龄或其他头的响应,它实际上就变成等同于no-cache自响应将立即被视为陈旧.
- 所以我要终于标记Gili的答案了!
当我访问chesseng.herokuapp.com时,我得到一个看起来像的响应头
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss
Run Code Online (Sandbox Code Playgroud)
然后我刷新页面然后得到
Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss
Run Code Online (Sandbox Code Playgroud)
所以看起来缓存工作正常.如果它适用于缓存,则Expires和Cache-Control的重点是:max-age.更令人困惑的是,当我在https://developers.google.com/speed/pagespeed/insights/上测试该页面时,它告诉我"利用浏览器缓存".
缓存控制标头"no-cache,must-revalidate,private"允许浏览器缓存资源,但强制使用条件请求重新验证.这在FF,Safari和Chrome中可以正常使用.
但是,IE7 + 8不发送条件请求,即请求头中缺少"If-Modified-Since",因此服务器使用HTTP/200而不是HTTP/304进行响应.
以下是完整的服务器响应标头:
Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Content-type: text/html;charset=utf-8
Content-Length: 10835
Date: Wed, 16 Feb 2011 13:52:26 GMT
Connection: keep-alive
Cache-Control: no-cache, must-revalidate, private
Run Code Online (Sandbox Code Playgroud)
这似乎是一个IE错误,但我没有在网上找到任何相关内容,所以我想知道是否可能缺少或存在另一个标头会让IE表现得很奇怪?
讨论no-cache和max-age 之间的区别:Cache-Control:max-age = 0和no-cache之间有什么区别?
我正在开发一个asp.net MVC Web应用程序,我需要知道在为我的操作方法定义OutputCache时是否存在任何差异,如下所示: -
[OutputCache(Duration = 0, Location = OutputCacheLocation.Client, VaryByParam = "*")]
Run Code Online (Sandbox Code Playgroud)
VS
[OutputCache(NoStore = true, Duration = 0, Location="None", VaryByParam = "*")]
Run Code Online (Sandbox Code Playgroud)
VS
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
Run Code Online (Sandbox Code Playgroud)
以上三种设置都会阻止缓存数据,或者每种设置都有不同的含义吗?
第二个问题定义duration=0&之间的主要区别是什么NoStore=true?他们俩会阻止缓存吗?谢谢
我没有找到Cache-Control:no-store和之间的实际区别Cache-Control:no-cache.
据我所知,这no-store意味着不允许缓存设备缓存该响应.另一方面,no-cache意味着不允许缓存设备提供缓存响应,而不首先使用源验证它.但那个验证是什么?有条件的?
如果答案有no-cache,但它没有Last-Modified或ETag?
问候.
我在S3上使用我的文件在cloudfront中创建了一个发行版.它工作正常,我的所有文件都可用.但今天我在S3上更新了我的文件并试图通过Cloudfront访问它们,但它仍然提供了旧文件.
我错过了什么?
我正在使用Chrome 40(这样的东西很漂亮和现代).
Cache-Control: max-age=0, no-cache在所有页面上设置 - 所以我希望浏览器只在其首先检查服务器并获得304 Not Modified响应时才使用其缓存中的内容.
然而,在按下后退按钮时,浏览器会快速点击其自己的缓存,而无需检查服务器.
如果我打开同一页面,就像我使用后退按钮一样,在新选项卡中,它会检查服务器(并在303 See Other事情发生变化时获得响应).
请参阅下面的屏幕截图,其中显示了Chrome开发者工具的"网络"标签中两种不同情况的输出.
我认为我可以使用max-age=0, no-cache更轻量级的替代品no-store,我不希望用户通过后退按钮看到陈旧数据(但数据是无价值的,因此可以缓存).
我的理解no-cache(参见此处和此处的SO)是浏览器必须始终重新验证所有响应.那么为什么Chrome在使用后退按钮时不会这样做?
是no-store唯一的选择吗?
200 按下后退按钮的响应(来自缓存):

303 在新标签中请求同一页面时的响应:

我正在尝试在浏览器中缓存(javascript)资源并正确设置响应标头中的所有Cache-control:max-age,Expires和Etag(如屏幕截图所示).
浏览器请求"if-none-match"和"if-modified-since",并且在这两种情况下满足条件:
所以我应该得到回复304,对吗?但不,我一直得到200 OK,这意味着apache每次都会继续为文件服务(尽管是压缩的).经过Firefox,Chrome,curl测试 - 没用.服务器总是服务整个文件,即使我没有要求它...
使用curl,我已经将问题追溯到gzip和Etag:
这是请求/响应:
请求标题00:09:12.000
响应标头Δ1100ms
我正在使用express/Jade中的视图缓存遇到一些有趣的东西.控制器通过Mongoose从MongoDB获取文章并将其交给res.render函数.但是,在运行几分钟后,Express开始为该路由的所有请求提供相同的编译模板.这甚至发生在各种模板中使用的共享.jade包含.
数据库正在获取正确的文章,如果我将一些随机字符串传递给模板并不重要,我总是得到相同的输出.
这是控制器功能:
exports.show = function(req, res) {
var articleId;
articleId = req.params.id;
Article.findOne({
_id: articleId
}).populate('author').exec(function(err, article) {
if (err) {
console.log(err);
} else {
res.render('articles/show', {
article: article,
articleId: article.id
});
}
});
};
Run Code Online (Sandbox Code Playgroud)
这就是路线:
app.get('/articles/:id', articles.show);
Run Code Online (Sandbox Code Playgroud)
无论我是在生产模式还是在开发模式下运行,都会发生同样的事情.
有没有人用Express/Jade遇到这种情况?
caching ×5
http ×5
http-headers ×4
amazon-s3 ×1
asp.net ×1
asp.net-mvc ×1
c# ×1
express ×1
header ×1
http-caching ×1
https ×1
node.js ×1
pug ×1
response ×1