我一直在阅读很多相关内容,但仍然没有什么误解。
我读到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
标头,服务器可能会返回200
或304
(未修改)。
但为什么 第一次回复中的服务器还没有提到max-age
?它可以保存客户端不发送第二个请求!
,Q#3
虽然这个有条件的假设是为了让我免于下载整个页面,但是is still discourage,那么我还有其他选择吗? (对于静态数据)
,Q#4
iis
如何知道它是否被修改过?通过查看文件日期修改?你打算告诉我,对于每个日期检查它是否正在进行IO
访问?如果没有,它在哪里保存该信息?
,Q#5
客户端收到第一个响应后,再次需要该页面。它是否再次使用If-Modified-Since
发送请求? if no,如果此页面 更改了此内容,该怎么办?如果是 - 为什么服务器响应max-age
标头?我跟它无关。
答案 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>