直接的页面不管怎么改动etag都没有变化是为什么

直接的页面不管怎么改动etag都没有变化是为什么,第1张

1、如果使用的是IE或者是基于IE的浏览器,那么问题可能是IE缓存造成的,工具—Internet选项,“常规”选项卡中有Internet临时文件,它是为了提高访问的速度,将某些页面存储在临时文件件中。

打开“设置”按钮,检查所存网页的较新版本,由“自动”改为“每次访问此页时检查”。

2、重新部署项目,这是最直接的办法,但是有一种情况下面是收不到效果的。在Tomcat目录Tomcat 6.0\work\Catalina\localhost中存在工程目录helloword,里面的内容主要是.java和.class文件,但是在某些非正常情况下面还会存在目录helloword.myeclipse.bak,其实这两个目录是属于同一个工程编译后的所生成的,如果当前访问的是helloword.myeclipse.bak,而所修改的jsp页面的内容被编译到helloword,那么无论是清除IE缓存还是重新部署都是没有用的,只要把localhost目录下的这两个目录删除,让tomcat重新去编译即可。

1、测试环境:

*** 作系统为REHL4,部署目标目录为/home/lighttpd;

2、使用版本:

使用lighttpd1.4.19版;

3、优化说明:

对etag头配置进行修改,,根据文件更新频繁程度,对不同的文件目录采用不同的expire策略;对于静态html/js/css文件均启用http压缩支持。主进程仅包含运行必须的模块,其他模块均排除,减少进程资源。

修改etag头是为了在集群环境中能够对相同的文件不用进行重复的请求,Lighttpd中可以通过设置etag.use-inode="disable",只设置mtime和size来解决这个问题,不过研发那边既然要求去掉Etag,那么就把Etag disable掉吧。(原来以为是可以将etag的输出disable掉的,但是如果同时启用了compress模块,会有问题,compress仍然会输出etag头,看了网上的一些文档,似乎可以通过hack手段修改源码来解决这个问题,但是没有时间去测试这个方法的稳定性,只得作罢。但是需要注意集群环境中文件的时间和大小需要一致)

4、测试说明:

对大日志(超过2G的日志)、系统性能、Etag和expire头均进行过基本的测试;

关于压缩功能的测试,需要说明一点,lighttpd的compress模块只对超过一定大小的文件才启用压缩,这个具体的文件大小也没有找到相关的说明。

5、部署拓扑:

使用四层交换机对客户的静态文件请求进行负载均衡调度,服务器之间用rsync来进行文件同步。

一、编译:

1、下载安装包:

安装mod cache需要打补丁,使用的lighttpd版本为lighttpd-1.4.19,对应的patch版本为lighttpd-1.4.19.modcache.v.1.4.4.patch (mod cache是一个类似于squid,可以通过lighttpd来实现squid的功能,考虑到将来的扩展和部署,可以在安装是将mod cache一并安装) 。

安装 mod cache需要gamin和pcre,也一并下载安装。按照下面的安装方式,所有的功能模块都是安装在同一个目录下面,这样便于整个备份和删除。

安装 mod cache 需要打补丁,需要一并下载。

响应头信息有:

Cache-Control 是用来控制缓存的,比如缓存要不要开启,缓存时长是多少,要不要每次请求缓存前都需要校验等等。 ETag 和 Last-Modified 是用于缓存失效后的校验,它们都需要对应的请求头一起使用。

通常 Cache-Control 会搭配 ETag 或 Last-Modified 一起使用用于更好的控制缓存,当然也可以只使用其中一个。

Expires 头信息返回的值是一个时间日期,在这个日期之后响应被视为已过期。

从这里的定义可以看到它的优先级比 Cache-Control 低,如果响应有 Cache-Control 头信息则 Expires 头信息会被忽略。

这是因为 Cache-Control 和 ETag HTTP 1.1 新增加的响应头, Expires 和 Last-Modified HTTP 1.1 之前的响应头。至于新加的响应头的好处其中之一是控制更精确(Last-Modified 只到秒级别)。

ETag 是响应内容某个指定版本的一个标识符,通常可以用文件的 hash 或者某个固定规则的算法,比如文章最后修改时间的 MD5 等。

它的规范如下,W 开头规范是弱校验用的,这里就不展开了

ETag 另一个典型的用法是缓存未更改的资源

ETag 和 Last-Modified 是用来校验缓存用的,可以理解成缓存的一个ID,它们都有对应请求头, If-None-Match 和 If-Modified-Since ,服务端在发出响应之前会根据请求的头信息去匹配计算,比如请求头有 If-None-Match : 'ak1017',服务端在响应之前会计算档次响应的 ETag 和这个值相等就会响应一个 304 没有内容的响应,客户端在接收到 304 之后就会继续使用上次缓存的内容。达到节省流量,提升响应时间。

Last-modified and If-Modified-Since

this is resopone header and request header, they match each other,

ETag and If-None-Match

一个请求命中缓存会响应的状态

下面是一个响应头同时包含 Cache-Control 和 Last-Modified 的例子

下面的访问测试都是基于 chrome 浏览器 87.0.4280.88

下面是一个响应头同时包含 Cache-Control 和 ETag 的例子

这里的再次请求有时会遇到响应 200 但响应内容没有的情况

some | etag.css | 200 OK | stylesheet | 174 B 77.4 kB

设置 Cache-Control 后浏览器再次请求资源时候如果缓存没有过期则就直接使用缓存,在缓存过期后会向服务端发起请求,这时接收到一个 304 客户端继续使用上次的缓存内容并更新了缓存有效期。

下面是一个响应头只有 ETag 的例子

这里不设置 Cache-Control 浏览器默认也会把资源存入缓存,只是每次请求都会向远端服务器发起校验,然后接收到响应 304 继续使用上次的响应内容。

下面是一个响应头只有 Last-Modified 的例子

相比较只有 ETag 响应头的,这里只有 Last-Modified 响应头,再次请求都是直接使用缓存的内容,在测试中没发现资源有向远端发起校验,这里也没有设置对应的缓存时长,why?(这里只在设置的 Last-Modified 时间是已过期的情况,如果 Last-Modified 没有过期在过期之前访问还是会响应 304 ,只是在后续多次访问后会变成 memory cache )

下面是一个响应头包含 Expires 和 Last-Modified 的例子

这里可以看到设置 Expires 和 Cache-Control 有同样的效果

下面是一个响应头设置 Cache-Control: no-store 和 ETag 的例子

设置为 no-store 的资源,浏览器端就不会启用缓存,每次都成远端获取最新的内容,且请求头不会追加对应的 If-None-Match

浏览器什么情况下会把请求的资源存入缓存?

只要请求到的响应头开启缓存( Cache-Control: max-age=<number> 或 Expires )或包含 ETag 响应头,或者即使没有设置 Cache-Control 浏览器都会把资源默认存入缓存,除非明确设置 Cache-Control: no-store 不需要浏览器存储缓存。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11174824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存