HTTP 1.1引入了一类新的标头,Cache-Control响应标头,使Web发布者能够更好地控制其内容,并解决Expires的限制.
由于其局限性,过期是一种痛苦.首先,因为涉及绝对日期,所以必须同步Web服务器上的时钟和客户端的缓存; 如果他们对时间有不同的想法,那么预期的结果将无法实现,而缓存可能会错误地将陈旧的内容视为新鲜的.
Expires的另一个问题是,很容易忘记您已将某些内容设置为在特定时间到期.如果在通过之前未更新Expires时间,则每个请求都将返回到Web服务器,从而增加了负载和延迟.
那么,我们是否需要再使用Expires,或者Cache-Control(具体来说,max-age设置为一些远期的秒数)足以支持我的静态内容?我想避免使用Expires,但我应该同时设置吗?
我有一个Web应用程序,可以让浏览器长时间缓存AJAX请求.我已经找到了如何在检测到可能的修改时提出完全绕过缓存的请求.但我想让用户触发数据刷新.
在这种情况下,我希望浏览器检查服务器是否停止缓存,但如果不缓存则使用它(即,如果服务器响应304代码).目标是节省加载时间,因为数据量巨大.
服务器在所有响应中包含以下标头:
Cache-Control: private, max-age=604800
Last-Modified: ... # actual last modification date
Run Code Online (Sandbox Code Playgroud)
我设法通过在请求中使用以下HTTP标头完全在Chrome中破解了缓存对象(尚未测试其他浏览器):
Cache-Control: max-age=0
If-Last-Modified: Tue, 01 Jan 1970 01:00:00 +0100
Run Code Online (Sandbox Code Playgroud)
这If-Last-Modified条线是真正具有效果的线.Chrome似乎忽略Cache-Control了请求中的标头.
我还发现Cache-Control: must-revalidate在服务器响应中使用强制浏览器为每个请求验证其缓存与服务器.
但有没有办法重新验证只有一个精确的请求,在客户端决定?
请注意,我并没有特别依赖于使用HTTP标头执行此操作,因此欢迎任何其他我不了解的方法!
我有一个网页,当我访问材料时返回以下标题:
HTTP/1.1 200 OK
Date: Sat, 29 Jun 2013 15:57:25 GMT
Server: Apache
Content-Length: 2247515
Cache-Control: no-cache, no-store, must-revalidate, max-age=-1
Pragma: no-cache, no-store
Expires: -1
Connection: close
Run Code Online (Sandbox Code Playgroud)
使用chrome扩展,我想修改它,response header以便实际缓存材料而不是浪费带宽.
我有以下示例代码:
chrome.webRequest.onHeadersReceived.addListener(function(details)
{
// Delete the required elements
removeHeader(details.responseHeaders, 'pragma');
removeHeader(details.responseHeaders, 'expires');
// Modify cache-control
updateHeader(details.responseHeaders, 'cache-control', 'max-age=3600;')
console.log(details.url);
console.log(details.responseHeaders);
return{responseHeaders: details.responseHeaders};
},
{urls: ["<all_urls>"]}, ['blocking', 'responseHeaders']
);
Run Code Online (Sandbox Code Playgroud)
这正确地将标题修改为这样的东西(基于console.log()输出):
HTTP/1.1 200 OK
Date: Sat, 29 Jun 2013 15:57:25 GMT
Server: Apache
Content-Length: 2247515
Cache-Control: max-age=3600
Connection: close
Run Code Online (Sandbox Code Playgroud)
但基于我试图检查的所有内容,我无法看到任何证据确实发生了这种情况:
google-chrome httpresponse cache-control http-headers google-chrome-extension
Apache正在为3 ##状态代码发送Cache-Control标头,例如302重定向.这导致Firefox(可能从Firefox 5开始)缓存302重定向 - 这导致我的某些页面无限重定向循环.
以下是我在我使用的设置httpd.conf:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A600
</IfModule>
Run Code Online (Sandbox Code Playgroud)
如果我删除了ExpiresDefault设置,问题就会消失,所以我确信这是造成问题的确切设置.如果我改变ExpiresDefault A600对ExpiresByType text/html A600这个问题仍然存在.
我希望默认情况下让浏览器缓存我的内容,但这是一个交易破坏者.
是否有任何设置可以告诉Apache为3 ##状态代码发送不同的Cache-Control标头?
我试图了解cache-controlhttp 标头是如何工作的。
标cache-control头可以有no-cache值。我查了一下定义w3c,它说:
如果该
no-cache指令未指定字段名称,则在未成功与源服务器重新验证的情况下,缓存不得使用响应来满足后续请求。
它告诉no-cachevalue 将触发每个请求的验证。
我想知道的是,cache validationhttp协议是什么以及它的作用是什么?
谢谢你们的帮助。现在我明白验证意味着检查缓存是否包含来自服务器的最新内容。
我的进一步问题是无缓存将解决哪些问题。请提供一些场景,例如在http标头中应用no-cache后,将修复哪些安全问题。
多谢你们
我有一个S3存储桶,其上面有CloudFront CDN.
这个S3存储桶是"不可变的",这意味着一旦我在那里上传文件,我就永远不会删除它或更新它.所有客户端都可以非常积极地缓存来自S3/CloudFront的文件.
目前,Etags工作得非常好,客户大多数时间都会收到304回复.但是获得304响应仍然需要通过更积极的缓存来避免往返.
所以我想要这样的行为:
CloudFront CDN缓存永远不会失效,因为S3缓存永远不会更改.CloudFront不需要再次向S3询问文件多次.我想我已经使用CloudFront分配设置成功配置了它.
CloudFront应该使用标头提供所有文件Cache-Control: max-age=365000000, immutable(截至2016年,immutable是一个新的,部分支持的值)
我不明白我怎样才能达到预期的效果.我应该在CloudFront或S3级别处理吗?我已经阅读了一些关于为每个S3文件配置适当标头的内容.是不是有一个全局设置来提供我可以使用的自定义http标头的所有文件?
caching cache-control amazon-s3 amazon-web-services amazon-cloudfront
我有以下配置(对于 Angular 应用程序):
location / {
try_files $uri /index.html;
add_header "Cache-Control" "no-cache" ;
}
Run Code Online (Sandbox Code Playgroud)
现在我想仅为index.html,但不为任何其他文件添加该标头。怎么做?
我有一个 amazon cloudfront 发行版,它为我的 CDN 创建了一个“来源”。在我的行为中,我设置了最大 TTL、最小 TTL 和默认 TTL。但是我的响应头不会在重定向的静态文件中返回 Cache-control 头。如何设置缓存控制?我需要这个用于谷歌页面洞察
header cache-control amazon-web-services amazon-cloudfront pagespeed-insights
始终提供来自 CDN EDGE 缓存的内容,无论内容多么陈旧。尽可能在后台刷新它。
我有一个NextJS应用程序,它在服务器端呈现一些 React 组件并将它们交付给客户端。对于这个讨论,让我们只考虑我的主页,它是未经身份验证的,对每个人都是一样的。
我想要的是将服务器呈现的主页缓存在 CDN 的 EDGE 节点上,并尽可能多地或始终从该缓存中为终端客户端提供服务。
从我读到的内容来看,CDN(如 Fastly)正确支持缓存相关的标头设置,例如Surrogate-Control并且Cache-Control: stale-while-revalidate应该能够做到这一点,但实际上,我没有看到它像我期望的那样工作。我看到的是:
考虑以下时间线:
[T0] - Visitor1 请求www.mysite.com- CDN 缓存完全冷,因此请求必须返回我的源(AWS Lambda)并重新计算主页。返回带有标头Surrogate-Control: max-age=100和 的响应Cache-Control: public, no-store, must-revalidate。然后访问者 1 提供了主页,但他们不得不等待高达 5 秒钟!呸!愿没有其他游客遭受同样的命运。
[T50] - 访问者 2 请求www.mysite.com- CDN 缓存包含我的文档并立即将其返回给访问者。他们只需要等待 40 毫秒!惊人的。在后台,CDN 从我的源重新获取最新版本的主页。原来它没有改变。
[T80] -www.mysite.com向主页发布新内容,使任何缓存的内容真正过时。该网站的V2现已上线!
[T110] - 访问者 1 返回到www.mysite.com- 从 CDN 的角度来看,自访问者 2 的请求以来只有 60 …
Chrome devtools 网络选项卡显示与缓存资源文件大小相同的“通过网络传输的数据”值。如果我阻止上图中出现的最后一个请求,则不会加载图片,但第二个请求仍然显示传输了相同数量的数据。如何知道图像资源是否真正从缓存中提取并节省了带宽?
注意:我正在使用 max-age 缓存控制策略,并且在 Firefox 中它显然有效。
caching cache-control http-headers google-chrome-devtools max-age
cache-control ×10
http-headers ×5
http ×3
caching ×2
ajax ×1
amazon-s3 ×1
apache ×1
cdn ×1
cloudflare ×1
fastly ×1
header ×1
httpresponse ×1
javascript ×1
max-age ×1
mod-expires ×1
next.js ×1
nginx ×1
redirect ×1
w3c ×1