我有一个网站正在接收许多对静态资源(图像、css 文件等)的意外请求,我希望这些请求可以直接从浏览器的缓存中获得。这是一个性能问题,我不明白为什么会这样。
对于每个静态资源,网站返回一个Expires
未来 24 小时的Last-Modified
标题、一个图像/css 文件修改日期的标题和一个ETag
:
Expires: Wed, 07 Dec 2011 13:50:47 GMT
Last-Modified: Thu, 14 Jul 2011 15:19:16 GMT
ETag: W/"4875-1310656756000"
有了这些设置,我希望在浏览器第一次请求图像或 css 文件之后:
- 它不会在另外 24 小时内重新请求资源
- 24 小时后,它将重新请求资源,传递一个
If-Modified-Since
标头和一个If-None-Match
标头,服务器将以304
状态响应(假设服务器端没有任何变化)。
这是大多数时候发生的事情。
但是,我看到一些浏览器会话,其中静态资源似乎没有被缓存并且每个页面都被请求。
查看这些请求,我看不到任何If-Modified-Since
或If-None-Match
收到的标头。然后服务器200
每次都以状态响应,并返回请求的资源。这是我想追踪的性能问题。
我怀疑问题是由于浏览器和网站之间存在 HTTP 代理/缓存(问题会话通常来自公司防火墙后面)。如果是这样,我不明白为什么代理会以这种方式干扰 // 标Expires
头Etag
。Last-Modified
如果它们相关,请提供一些附加信息:
- 我目前没有设置
Date
标题。Expires
/标题是否需要Last-Modified
正常工作? - 我目前没有设置
Cache-Control
标题,我认为Expires
/Last-Modified
会“足够好”。 - 该网站同时部署在 https 和 http 上,我在两种部署中都看到了这个问题。我原以为这会阻止代理成为原因,但现在了解某些代理确实会拦截 SSL 流量。
有没有其他人经历过类似的事情并发现它发生的原因?