expires_in max-age 缓存控制不起作用

Posted

技术标签:

【中文标题】expires_in max-age 缓存控制不起作用【英文标题】:expires_in max-age cache control doesn't work 【发布时间】:2015-12-04 06:34:37 【问题描述】:

我无法让 max-age 缓存控件正常工作, 我使用了expires_in,它产生了“Cache-Control:max-age=86400, public, must-revalidate”标头。

但是,浏览器仍然向服务器发送请求,至少定义为“304 未修改”,这意味着 ETag/If-None-Match 标头正常工作。

我已经在我的本地主机和 heroku 上使用 webrick 对其进行了测试, 使用 chrome 45 和 Safari。

不,我的开发工具没有打开,“禁用缓存”也没有勾选。

我也尝试删除 expires_in 方法调用的“, must_revalidate: true”。

我错过了什么?

以下是 chrome 中网络的输出: 一般: 远程地址:127.0.0.1:3000 请求网址:http://localtest.me:3000/api/books 请求方法:GET 状态码:304 未修改

响应标头: 访问控制允许来源:* 访问控制请求方法:* Cache-Control:max-age=86400, public, must-revalidate 连接:保活 日期:格林威治标准时间 2015 年 9 月 8 日星期二 13:28:01 Etag:W/"1f1b2d0b822830bc74e7c47a116205be" 服务器:WEBrick/1.3.1 (Ruby/2.2.1/2015-02-26) X-Content-Type-Options:nosniff X 框架选项:SAMEORIGIN X 请求 ID:c70d4715-dcff-4558-85af-9d21556d406a X-运行时:0.553353 X-Xss-保护:1;模式=块

请求标头: 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8,fr;q=0.6,he;q=0.4 缓存控制:max-age=0 连接:保持活动 主机:localtest.me:3000 If-None-Match:W/"1f1b2d0b822830bc74e7c47a116205be" 升级不安全请求:1 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36

这里是 ruby​​ 代码:

before_action :cache_control, only: [:index, :show]
def cache_control
  expires_in 1.day, public: true, must_revalidate: true
end

【问题讨论】:

【参考方案1】:

嗯,标题很好,它只是浏览器如何处理重新加载按钮或快捷键的米。

我在这里找到了答案:https://***.com/a/16510707/789658

以下是 chrome 中的发现:

    在地址栏上按 Enter 会遵守“max-age”,并且不会向服务器发送请求。 重新加载按钮或 Cmd+R 发送一个请求到服务器 If-Modified-Since 如果资源没有被修改,将返回 304... Cmd+Shift+R 发送请求到服务器甚至没有If-Modified-Since

【讨论】:

以上是关于expires_in max-age 缓存控制不起作用的主要内容,如果未能解决你的问题,请参考以下文章

即使使用缓存控制,来自云端的 RefreshHit:max-age=0, no-store

http 304 响应与缓存控制相结合似乎不适用于 max-age

带有缓存策略的 AFHTTPSessionManager 不起作用

Nginx add_header 和缓存控制

禁用 Spring Security 标头不起作用

为啥 Chrome 会使用 max-age 标头请求已缓存的图像?