Expires和max-age的区别

Expires和max-age都可以用来指定文档的过期时间,但是二者有一些细微差别

1.Expires在HTTP/1.0中已经定义,Cache-Control:max-age在HTTP/1.1中才有定义,为了向下兼容,仅使用max-age不够;
2.Expires指定一个绝对的过期时间(GMT格式),这么做会导致至少2个问题1)客户端和服务器时间不同步导致Expires的配置出现问题 2)很容易在配置后忘记具体的过期时间,导致过期来临出现浪涌现象;

3.max-age 指定的是从文档被访问后的存活时间,这个时间是个相对值(比如:3600s),相对的是文档第一次被请求时服务器记录的Request_time(请求时间)

4.Expires指定的时间可以是相对文件的最后访问时间(Atime)或者修改时间(MTime),而max-age相对对的是文档的请求时间(Atime)

5.在Apache中,max-age是根据Expires的时间来计算出来的max-age = expires- request_time:(mod_expires.c)

429 expires = base + additional;
430 apr_table_mergen(t, "Cache-Control",
431 apr_psprintf(r->pool, "max-age=%" APR_TIME_T_FMT,
432 apr_time_sec(expires - r->request_time)));

注:如果是A,base=request_time,M的话base=finfo.mtime.
expires - request_time得到max-age,如果Expires根据的是A(也就是AccessTime)设置的(A后面的值就是addtional),那么expires设置的值就等于addtional值,但是如果Expires根据的是Mtime,那么如果M后面的参数小于最后修改时间到当前时间的差(比方说2小时前修改了文件(19:00:00),现在设置M3600(现在是21:00:00)并且访问,max-age=expires-request_time = (finfo.mtime+additional)- request_time),计算出的max-age就是负数(可以试验看到这个结果):
max-age = (19:00:00+3600/3600) - 21:00:00 = -3600s

这样,在Apache中,max-age就不仅仅是相对Atime的时间了,如果设置为M,相对的是Mtime。

时间: 2024-10-12 09:55:24

Expires和max-age的区别的相关文章

varchar(n)和varchar(max)有什么区别

如果列数据项的大小一致,则使用 char. 如果列数据项的大小差异相当大,则使用 varchar. 如果列数据项大小相差很大,而且大小可能超过 8,000 字节,请使用 varchar(max).

详解Session和cookie

1.cookie 1.1. 为什么会有cookie? 由于HTTP是无状态的,服务端并不记得你之前的状态.这种设计是为了HTTP协议的方便,但是也存在一些问题.比如我们登录一个购物网站,我们需要用户登录后才能进行物品的购买,但是由于HTTP无状态性,在你向服务端发起下一次请求的时候服务端并不会记得你之前登录过,所以服务端会要求客户再次登录:显然这样的用户体验是非常不好的,这个例子在我之前做购物网站的时候也遇见过.于是就引入了cookie来保存你的用户名.密码.浏览的网页等信息.当客户端要发送ht

数据库里any 和 all 的区别

any 是任意一个all 是所有 比如select * from student where 班级='01' and age > all (select age from student where 班级='02');就是说,查询出01班中,年龄大于 02班所有人 的 同学相当于1select * from student where 班级='01' and age > (select max(age) from student where 班级='02'); 而1select * from

SQL中存在两个max条件的查询语句

前段时间找工作参加笔试,笔试题中有一道sql查询语句,条件是两个字段都是最大值,第一直觉是两个字段(例如age.hight)都等于max(),用一个行子查询就行了.第二直觉又不是,如果表中恰好有一条age=max(age),hight=max(hight)的数据,行子查询是没问题的.但是如果age=max(age)的数据hight!=max(hight)并且hight=max(hight)的数据age=!max(age)呢?那么查出来的结果必然是空. 我想首先保证age=max(age),在ag

Hadoop实战-MapReduce之max、min、avg统计(六)

1.数据准备: Mike,35 Steven,40 Ken,28 Cindy,32 2.预期结果 Max 40 Min 28 Avg      33 3.MapReduce代码如下 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.

MySQL中MAX函数与Group By一起使用的注意事项(转)

mysql> select * from test; +----+-------+------+-------+ | id | name | age | class | +----+-------+------+-------+ | 1 | qiu | 22 | 1 | | 2 | liu | 42 | 1 | | 4 | zheng | 20 | 2 | | 3 | qian | 20 | 2 | | 0 | wang | 11 | 3 | | 6 | li | 33 | 3 | +----+

LiteQuery MAX(Integer)、MAX(String) 判断是否返回值

unit Unit6; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, LiteCall, LiteConsts, Vcl.StdCtrls, Data.DB, MemDS, DBAccess, LiteAccess; type TForm6 =

mysql max 函数的陷阱

age  0,1,2,3,4,50,6 类似的一个sql SELECT max(age) FROM   (SELECT age    FROM xxx) a 在我的机器上返回了 6 50被判定为比6小,我猜max是拿age当字符来计算大小了 解决的办法是在age后面加一个  +0 : SELECT max(age+0) FROM   (SELECT age    FROM xxx) a

oracle max()函数和min()函数

当需要了解一列中的最大值时,可以使用MAX()函数:同样,当需要了解一列中的最小值时,可以使用MIN()函数.语法如下. SELECT          MAX (column_name) / MIN (column_name) FROM            table_name 说明:列column_name中的数据可以是数值.字符串或是日期时间数据类型.MAX()/MIN()函数将返回与被传递的列同一数据类型的单一值. 实例7 MAX()函数的使用 查询TEACHER表中教师的最大年龄.实

[从零搭网站五]http网站Tomcat配置web.xml和server.xml

点击下面连接查看从零开始搭网站全系列 从零开始搭网站 上一章我们在CentOS下搭建了Tomcat,但是还是没有跑起来...那么这一章就把最后的配置给大家放上去. 有两种方式:一种是用 rm -f 给这两个文件删掉,再用vim建新的出来.另一种是vim编辑,输入:set nu 显示行号,再输入:1,最后一行的行号d 把全文删掉. 然后再复制粘贴我给你们的配置文件就行. web.xml  , 完全不用修改,直接复制就行了: <?xml version="1.0" encoding=