1

我已经阅读了很多关于此的内容,但仍然很少有误解。

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

我使用提琴手作曲家提出这个请求

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 <======
...

Q#1

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

Q#2

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

Q#3

虽然这个有条件的假设可以让我免于下载整个页面,但仍然不鼓励 ,那么我还有什么其他选择?(对于静态数据)

Q#4

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

Q#5

在客户端得到第一个响应后,它需要再次访问该页面。它是否再次发送请求If-Modified-Since如果不是,如果页面在这个 intreval 期间确实发生了变化怎么办?如果是 - 为什么服务器用max-ageheader 响应?我与它无关。

4

1 回答 1

2

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

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

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

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

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

Q2:因为 max-age 没有开启。它不会自动发生。

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

Q4:IIS 与所有其他服务器一样,必须配置为启用 max-age。不涉及猜测。至于确定是否发生了变化,这确实涉及将客户端在 If-Modified-Since 标头中发送的日期与存储在服务器上的日期信息进行比较。对于文件中的静态数据,这通常会涉及系统调用,例如 Windows 上的 GetFileAttributesEx() 或其他平台上的 fstat()。

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

于 2013-01-01T23:31:46.663 回答