Http header -缓存控制 : max-age - behaviour?

标签 http iis http-headers httprequest fiddler

我已经阅读了很多关于此的内容,但仍然存在一些误解。

我读到 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/

相关文章:

iis - Powershell - 在 Windows 更新后创建 ServerManager 对象时出错

c++ - 使用套接字跟踪 HTTP 响应 header

javascript - 在等待 Promise 时切换 AngularJS View

RCurl getForm 传递 http header

windows - 使用带有 Web 平台安装程序 API 的 Powershell 仅在 64 位计算机上获取 x86 安装程序

php - 使用 http-header 强制下载字符串

javascript - header 中包含文件数据的发布请求。好的做法吗?

android - http post方法将空值传递给服务器

http - Haskell http响应结果不可读

iis - 当前命令用法不支持该标识符。您指定了 'testname'