我已经阅读了很多关于此的内容,但仍然存在一些误解。
我读到 max-age
应该只设置为静态数据。
我使用 fiddler composer 来提出这个请求
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
header ,是否因为该页面是静态页面? (有人在服务器端设置了 max-age
)?
问题#2
客户端收到第一个响应后,下一次它会使用 If-Modified-Since
header 询问它,服务器可能会返回 200
或 304
(未修改)。
但为什么服务器在他的第一个响应 中没有提到max-age
?它可以避免客户端发送第二个请求!
问题#3
虽然这个条件让我免于下载整个页面,但是 is still discourage ,那么我还有什么其他选择? (对于静态数据)
问题#4
iis
如何知道它是否被修改了?通过查看文件修改日期?你要告诉我每个日期检查它都在做 IO
访问吗?如果没有,它将信息保存在哪里?
问题#5
客户端收到第一个响应后,它需要再次访问该页面。它是否再次发送带有 If-Modified-Since
的请求? if no ,如果在此间隔期间页面确实发生了变化怎么办?如果是 - 为什么服务器响应 max-age
header ?我与它无关。
最佳答案
必须显式启用 Cache-Control header 的 max-age 子句。显然,这样做的确切方式取决于 server software .
Last-Modified: 和 If-Modified-Since: 交互独立于此,因为该机制早在 max-age 之前就已发明。
对于服务器不知道(再次通过特定于服务器的方式)动态生成的任何服务器端资源,您将始终获得 Last-Modified: 。 Cache-Control: max-age=whatever,如果也存在,允许客户端或缓存保存更新请求(使用 If-Modified-Since)。
但是这个额外的 header 需要服务器设置。对于“静态数据”,它不会自动发生。 Last-Modified: 也不表示“静态数据”。 (服务器端处理程序进程可以生成 Last-Modified header 以中继到客户端。)
Q1:否。服务器未配置为将数据识别为动态数据。 max-age 与它无关。
Q2:因为没有开启max-age。它不会自动发生。
Q3:没有其他选择。 If-Modified-Since 旨在节省带宽。
Q4:与所有其他服务器一样,IIS 必须是 configured to enable max-age .不涉及猜测。至于确定是否发生了某些变化,这确实涉及将客户端在 If-Modified-Since header 中发送的日期与存储在服务器上的日期信息进行比较。对于文件中的静态数据,这通常会涉及系统调用,例如 Windows 上的 GetFileAttributesEx() 或其他平台上的 fstat()。
Q5:如果客户端在 Cache-Control: max-age previously received from the server 已过期之前发出更新请求(使用 If-Modified-Since:),则要么客户端损坏,要么正在执行外部触发的“强制更新/刷新”选项。 (请注意,If-Modified-Since 请求假定客户端在某些缓存中仍然有以前的版本。如果没有,那么它不会发送此 header ,仅仅是因为它没有日期!)
关于Http header -缓存控制 : max-age - behaviour?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092313/