header Cache-Control: max-age=0意味着内容被认为是过期的(必须立即重新获取),这实际上与Cache-Control: no-cache是一样的。
当前回答
max-age When an intermediate cache is forced, by means of a max-age=0 directive, to revalidate its own cache entry, and the client has supplied its own validator in the request, the supplied validator might differ from the validator currently stored with the cache entry. In this case, the cache MAY use either validator in making its own request without affecting semantic transparency. However, the choice of validator might affect performance. The best approach is for the intermediate cache to use its own validator when making its request. If the server replies with 304 (Not Modified), then the cache can return its now validated copy to the client with a 200 (OK) response. If the server replies with a new entity and cache validator, however, the intermediate cache can compare the returned validator with the one provided in the client's request, using the strong comparison function. If the client's validator is equal to the origin server's, then the intermediate cache simply returns 304 (Not Modified). Otherwise, it returns the new entity with a 200 (OK) response. If a request includes the no-cache directive, it SHOULD NOT include min-fresh, max-stale, or max-age.
礼貌:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html # sec14.9.4
不要接受这个答案-我必须读它才能理解它的真正用法:)
其他回答
One thing that (surprisingly) hasn't been mentioned is that a request can explicitly indicate that it will accept stale data, using the max-stale directive. In that case, if the server responded with max-age=0, the cache would merely consider the response stale, and would be free to use it to satisfy the client's request [which asked for potentially-stale data]. By contrast, if the server sends no-cache that really does trump any request by the client (with max-stale) for stale data, as the cache MUST revalidate.
max-age When an intermediate cache is forced, by means of a max-age=0 directive, to revalidate its own cache entry, and the client has supplied its own validator in the request, the supplied validator might differ from the validator currently stored with the cache entry. In this case, the cache MAY use either validator in making its own request without affecting semantic transparency. However, the choice of validator might affect performance. The best approach is for the intermediate cache to use its own validator when making its request. If the server replies with 304 (Not Modified), then the cache can return its now validated copy to the client with a 200 (OK) response. If the server replies with a new entity and cache validator, however, the intermediate cache can compare the returned validator with the one provided in the client's request, using the strong comparison function. If the client's validator is equal to the origin server's, then the intermediate cache simply returns 304 (Not Modified). Otherwise, it returns the new entity with a 200 (OK) response. If a request includes the no-cache directive, it SHOULD NOT include min-fresh, max-stale, or max-age.
礼貌:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html # sec14.9.4
不要接受这个答案-我必须读它才能理解它的真正用法:)
我不是缓存专家,但Mark Nottingham是。这里是他的缓存文档。他在参考资料部分也有很好的链接。
根据我对这些文档的阅读,它看起来像max-age=0可以允许缓存发送缓存的响应到“同一时间”的请求,其中“同一时间”意味着足够接近,它们看起来与缓存同步,但无缓存不会。
这在MDN文档中直接回答了缓存控制:
大多数HTTP/1.0缓存不支持无缓存指令,所以 历史上max-age=0被用作一种变通方法。但只有 Max-age =0可能会导致在缓存时重用一个陈旧的响应 与源服务器断开连接。必须重新验证才能解决这个问题。 这就是为什么下面的例子等同于无缓存。 Cache-Control: max-age=0,必须重新验证 但是现在,您可以简单地使用无缓存代替。
在MDN文档中也有缓存验证:
It is often stated that the combination of max-age=0 and must-revalidate has the same meaning as no-cache. Cache-Control: max-age=0, must-revalidate max-age=0 means that the response is immediately stale, and must-revalidate means that it must not be reused without revalidation once it is stale — so in combination, the semantics seem to be the same as no-cache. However, that usage of max-age=0 is a remnant of the fact that many implementations prior to HTTP/1.1 were unable to handle the no-cache directive — and so to deal with that limitation, max-age=0 was used as a workaround. But now that HTTP/1.1-conformant servers are widely deployed, there's no reason to ever use that max-age=0-and-must-revalidate combination — you should instead just use no-cache.
顺便说一下,值得注意的是,一些移动设备,特别是苹果产品,如iPhone/iPad完全忽略了诸如no-cache, no-store, Expires: 0或其他任何你可能试图强迫他们不要重用过期表单页面的头文件。
This has caused us no end of headaches as we try to get the issue of a user's iPad say, being left asleep on a page they have reached through a form process, say step 2 of 3, and then the device totally ignores the store/cache directives, and as far as I can tell, simply takes what is a virtual snapshot of the page from its last state, that is, ignoring what it was told explicitly, and, not only that, taking a page that should not be stored, and storing it without actually checking it again, which leads to all kinds of strange Session issues, among other things.
我只是为了防止有人不知道为什么他们会在iphone和ipad上出现会话错误,这似乎是迄今为止最严重的问题。
关于这个问题,我已经做了相当广泛的调试器测试,这是我的结论,设备完全忽略了这些指令。
即使在日常使用中,我发现一些手机也完全无法检查新版本,例如,过期:0,然后检查最近修改的日期,以确定是否应该获得一个新的版本。
它根本不会发生,所以我被迫做的是向我需要强制更新的css/js文件添加查询字符串,这欺骗了愚蠢的移动设备,认为这是一个它没有的文件,比如:my.css?V =1,然后V =2的css/js更新。这在很大程度上是有效的。
User browsers also, by the way, if left to their defaults, as of 2016, as I continuously discover (we do a LOT of changes and updates to our site) also fail to check for last modified dates on such files, but the query string method fixes that issue. This is something I've noticed with clients and office people who tend to use basic normal user defaults on their browsers, and have no awareness of caching issues with css/js etc, almost invariably fail to get the new css/js on change, which means the defaults for their browsers, mostly MSIE / Firefox, are not doing what they are told to do, they ignore changes and ignore last modified dates and do not validate, even with Expires: 0 set explicitly.
这是一个很好的帖子,包含了很多很好的技术信息,但同样重要的是要注意到这些东西在移动设备上的支持有多差。每隔几个月,我就必须增加更多的保护层,防止他们无法遵循他们收到的头命令,或者正确地解释这些命令。
推荐文章
- 有没有办法在python中做HTTP PUT
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 什么是http头“X-XSS-Protection”?
- 在nodejs http中body在哪里。得到回应?
- Ruby:如何将散列转换为HTTP参数?
- 在用nodejs和express创建的REST API中设置响应状态和JSON内容的正确方法
- 使用curl在PHP中获取HTTP代码
- 为跨源请求设置cookie
- HTTP 1.1和HTTP 2.0的区别是什么?
- 是否有一个装饰器来缓存函数返回值?
- 什么是“升级-不安全-请求”HTTP报头?
- 向Angular HttpClient添加一个HTTP头并不会发送这个头,为什么?
- HTTP 301和308状态码有什么区别?
- 什么HTTP状态码应该用于错误的输入
- 编排microservices