Http Header - Cache-Control:max-age - 行为?

时间:2012-12-30 16:19:38

标签: http iis http-headers httprequest fiddler

我一直在阅读很多相关内容,但仍然没有什么误解。

我读到max-age只应设置为静态数据。

我用fiddler作曲家提出这个请求

User-Agent: Fiddler
Host: www.example.com

回复是:

HTTP/1.1 200 OK
Date: Tue, 01 Jan 2013 20:37:31 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Thu, 06 Dec 2012 19:40:14 GMT <======
...

问题#1

如果服务器发送last-modified标头,是不是该页面是静态页面? (有人在服务器端设置了max-age)?

,Q#2

客户端收到第一个响应后,下次会询问它是否带有If-Modified-Since标头,服务器可能会返回200304(未修改)。 但为什么 第一次回复中的服务器还没有提到max-age?它可以保存客户端不发送第二个请求!

,Q#3

虽然这个有条件的假设是为了让我免于下载整个页面,但是is still discourage,那么我还有其他选择吗? (对于静态数据)

,Q#4

iis如何知道它是否被修改过?通过查看文件日期修改?你打算告诉我,对于每个日期检查它是否正在进行IO访问?如果没有,它在哪里保存该信息?

,Q#5

客户端收到第一个响应后,再次需要该页面。它是否再次使用If-Modified-Since发送请求? if no,如果此页面 更改了此内容,该怎么办?如果是 - 为什么服务器响应max-age标头?我跟它无关。

1 个答案:

答案 0 :(得分:2)

必须显式启用Cache-Control标头的max-age子句。显然,这样做的确切方式取决于server software

Last-Modified:和If-Modified-Since:交互与此无关,因为该机制是在max-age之前发明的。

您将始终获得Last-Modified:对于任何服务器端资源,服务器不知道(再次,通过服务器特定的方式)动态生成。 Cache-Control:max-age =无论是否存在,还允许客户端或缓存保存更新请求(使用If-Modified-Since)。

但是这个额外的标题需要服务器设置。 “静态数据”不会自动发生。 Last-Modified:也不表示“静态数据”。 (服务器端处理程序进程可以生成一个Last-Modified标头,以便中继到客户端。)

Q1:否。服务器未配置为将数据识别为动态。 max-age与它无关。

Q2:因为未启用max-age。它不会自动发生。

问题3:没有其他选择。 If-Modified-Since旨在节省带宽。

问题4:与所有其他服务器一样,IIS必须是configured to enable max-age。没有猜测。至于确定某些内容是否已更改,此 涉及客户端在If-Modified-Since标头中发送的日期与存储在服务器上的日期信息的比较。对于文件中的静态数据,这通常涉及系统调用,例如Windows上的GetFileAttributesEx()或其他平台上的fstat()。

问题5:如果客户端在Cache-Control之前发出更新请求(使用If-Modified-Since :):先前从服务器收到的max-age已过期,则客户端已损坏,或者正在执行外部触发“强制更新/刷新”选项。 (请注意,If-Modified-Since请求会在某些缓存中按下客户端仍然具有以前的版本。如果没有,那么它将不会发送此标头,因为它没有日期!)< / p>