首页编程header cache-control 如何修改Cache-Control的值

header cache-control 如何修改Cache-Control的值

编程之家2023-11-03115次浏览

大家好,关于header cache-control很多朋友都还不太明白,今天小编就来为大家分享关于如何修改Cache-Control的值的知识,希望对各位有所帮助!

header cache-control 如何修改Cache-Control的值

如何修改Cache-Control的值

Apache模块 mod_expires

说明允许通过配置文件控制HTTP的"Expires"和"Cache-Control"头内容

状态扩展(E)

模块名 expires_module

源文件 mod_expires.c

概述

header cache-control 如何修改Cache-Control的值

这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。

这些HTTP头向客户端表明了文档的有效性和持久性。如果有缓存,文档就可以从缓存(除已经过期)而不是从服务器读取。接着,客户端考察缓存中的副本,看看是否过期或者失效,以决定是否必须从服务器获得更新。

要修改Cache-Control头中max-age(参见RFC 2616 section 14.9)项之外的内容,你还可以使用Header指令。

于是又看了:

Header指令

说明配置HTTP应答头

header cache-control 如何修改Cache-Control的值

语法 Header [condition] set|append|add|unset|echo header [value] [early|env=[!]variable]

作用域 server config, virtual host, directory,.htaccess

覆盖项 FileInfo

状态扩展(E)

模块 mod_headers

这个指令可以替换、合并、删除HTTP应答头。应答头紧跟在内容处理器和输出过滤器完工之后生成,这时候才能对头进行修改。

condition选项可以是onsuccess或always。它决定了将对哪个内部头(internal header)表进行操作。onsuccess表示"2xx"状态码,always表示所有状态码(包含"2xx")。特别地,如果你想撤销由某个模块设置的头,你应当做做试验,以找到是那个表产生的影响。

该指令执行的动作是由第二个参数决定的。这个参数取值范围如下:

set

设置新的或修改已经存在的同名应答头。value可以是一个格式字符串。

append

向同名应答头添加新内容而不修改原来已经存在的旧内容。当向一个已经存在的头添加新值时,将用逗号与原来已经存在的旧值分开。这是向HTTP头赋以多个值的标准方法。

add

向应答中添加新的头而不修改原来已经存在的头(即使同名)。这将可能导致有两个或更多的应答头具有相同的名字,从而导致意想不到的后果,所以通常不使用这种方法而用append来代替它。

unset

去除应答中同名的头(若存在的话)。如果有多个头同名,则会被全部去除。value必须被省略。

echo

将请求中同名的头复制到应答中。header可以是一个正则表达式。value必须被省略。

最后用Header set Cache-Control"no-cache"搞定

浅析HTTP消息头网页缓存控制以及header常用指令介绍

本篇文章是对HTTP消息头网页缓存控制以及header常用指令进行了详细的分析介绍需要的朋友参考下

网页的缓存是由HTTP消息头中的“Cache control”来控制的常见的取值有private no cache max age must revalidate等默认为private其作用根据不同的重新浏览方式分为以下几种情况()打开新窗口值为private no cache must revalidate那么打开新窗口访问时都会重新访问服务器而如果指定了max age值那么在此值内的时间里就不会重新访问服务器例如 Cache control: max age=(表示当访问此网页后的秒内再次访问不会去服务器)()在地址栏回车值为private或must revalidate则只有第一次访问时会访问服务器以后就不再访问值为no cache那么每次都会访问值为max age则在过期之前不会重复访问()按后退按扭值为private must revalidate max age则不会重访问值为no cache则每次都重复访问()按刷新按扭无论为何值都会重复访问 Cache control值为“no cache”时访问此页面不会在Internet临时文章夹留下页面备份另外通过指定“Expires”值也会影响到缓存例如指定Expires值为一个早已过去的时间那么访问此网时若重复在地址栏按回车那么每次都会重复访问 Expires: Fri Dec:: GMT比如禁止页面在IE中缓存响应消息头部设置 CacheControl= no cache Pragma=no cache Expires= Expires是个好东东如果服务器上的网页经常变化就把它设置为表示立即过期如果一个网页每天凌晨点更新可以把Expires设置为第二天的凌晨点当HTTP服务器指定CacheControl= no cache时浏览器就不会缓存该网页旧式 HTTP服务器不能使用 Cache Control标题所以为了向后兼容 HTTP服务器 IE使用Pragma:no cache标题对 HTTP提供特殊支持如果客户端通过安全连接(//)/与服务器通讯且服务器在响应中返回 Pragma:no cache标题则 Internet Explorer不会缓存此响应注意 Pragma:no cache仅当在安全连接中使用时才防止缓存如果在非安全页中使用处理方式与 Expires:相同该页将被缓存但被标记为立即过期 header常用指令 header分为三部分第一部分为HTTP协议的版本(HTTP Version)第二部分为状态代码(Status)第三部分为原因短语(Reason Phrase)

复制代码代码如下: lishixinzhi/Article/program/PHP/201311/21180

缓存Cache-Control

首先附上前面提到的一张图:

根据上面的这张图,来说http协议中的缓存,也就是cache-control将会格外清晰。

Cache-Control包括哪些特性呢?

第一,可缓存性:public  private  no-cache。可缓存性指http的response进过的哪些地方可以进行缓存。public指在response返回经过的任何地方都可以缓存,包括代理服务器,客户端等,这样下次请求将不会到达服务端而直接返回response;private则表示只有返回的浏览器才可以进行缓存;no-cache则表示不可直接用缓存,而是先要到服务器端进行验证。

第二,到期:max-age=<seconds>,代表缓存的时间(秒); s-maxage=<seconds>,专门为代理服务器设置,如果与max-age同时返回,则浏览器会读取max-age,而代理服务器则会读取s-maxage这个设置; max-stale=<seconds>,代表在max-age过期后,如果存在max-stale,而且其时间没有过期,则表示仍然可以用缓存,max-stale只在request发起端设置是有用的,又因为浏览器不会帮助我们带上这个头,所以客户端是浏览器的时候这个max-stale是用不到的。

第三,重新验证:must-revalidate和proxy-revalidate,这两个表示缓存过期时间到达以后,必须要到服务端重新请求和重新验证,这两个属性在浏览器也不怎么出现。

第四,其他,no-store,表示本地和代理服务器都不可以用缓存,必须去重新获取; no-transform,告诉代理服务器不要对返回的body进行处理,比如压缩等(代理服务器比如nginx等可以不遵守,但是这个是规范,最好遵守)。

下面附上做的几个简单的例子来加深对上面的理解。例子中通过查看对文件script.js的缓存情况说明问题。

执行node server.js,观察浏览器network如下图(这里注意,浏览器的Disable cache没有勾选,否则会默认忽略Cache-Control的设置):

立刻重新刷新浏览器,则network中出现下图:

此时我们可以看见这事size一栏是from memory cache,因为我们设置max-age为20s,在这个期间即使我改变script.js的内容,浏览器仍然会用memory里面的内容,而得不到更新。很显然实际开发中,如果出现这样的问题,是很可怕的。同时如果每次去后端请求response,又会使网页很慢,实际中max-age往往要设置很大,表示在本地保存很久的时间,那么下次请求的Time为0。那么实际开发中,如何去解决这两者的矛盾呢?就是通过改变url的方法,在请求的文件名后面加上根据内容生成的哈希值(刷新浏览器缓存的方案),这样实际请求的 url将会改变,那么自然就会去重新请求,如果后端的文件没有更新,也就是url没有变,则自然会在缓存中读取,则不需要经过网络传输,则速度是很快的,用户体验是很好的。 network一栏中,这里Size的两个值,上面表示传输时候的大小,下面表示实际的大小(上面的可进行压缩Gzip传输,但是不晓得header可不可以压缩,貌似http2中支持头压缩),传输时的大小比实际的大,因为加上了头信息。Time的两个值,上面一行表示从请求开始到接受完最后一个byte为止的时间。下面一行是Latency,代表从请求接受完到读取该资源第一个byte之间的等待时间。

上图是查找缓存的过程。

如果Cache-Control中max-age的值设置很大,那么一直用本地的缓存肯定是不可取的。所以除了给文件名后面加上哈希码之外的方法,我们可以通过每次去后端询问是否文件有所改动?那么如何来实现这个过程呢?首先在Cache-Control中设置no-cache,同时遵从实际情况我们把max-age设置很大。更改servr.js如下:

打开network,多次刷新仍然如下:

说明此时已经不在缓存中读取了,即使我们的max-age设置很大,这是因为我们设置了no-cache。所以每次我们都不会直接使用缓存了。那么如何发挥no-cache的作用呢,还需要配合资源验证,资源验证在http中主要有两个头:Last-Modified和Etag。这个内容介绍在-资源验证Last-Modified和Etag中介绍。

非常感谢您的阅读!我们希望本文对于解决您关于header cache-control的问题提供了一些有价值的信息。如果您还有其他疑问,我们将很乐意为您提供进一步的帮助。

我要建网站,建立网站需要什么手续wordpress优点?WordPress搭建企业网站有哪些优势