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

expires_in max-age cache control doesn't work

我无法使 max-age 缓存控制正常工作, 我使用了 expires_in 结果是 "Cache-Control:max-age=86400, public, must-revalidate" header.

但是,浏览器仍然向服务器发送请求,至少它被定义为“304 not modified”,也就是说ETag/If-None-Match header可以正常工作。

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

还有,我的开发工具没有打开,"disable cache"没有勾选

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

我错过了什么?

这是 chrome 中网络的输出: 一般: 远程 Address:127.0.0.1:3000 请求 URL:http://localtest.me:3000/api/books 请求 Method:GET 状态 Code:304 未修改

回复Headers: Access-Control-Allow-Origin:* Access-Control-Request-Method:* Cache-Control:max-age=86400, public, must-revalidate Connection:Keep-活着 Date:Tue,2015 年 9 月 8 日 13:28:01 GMT Etag:W/“1f1b2d0b822830bc74e7c47a116205be” 服务器:WEBrick/1.3.1 (Ruby/2.2.1/2015-02-26) X-Content-Type-Options:nosniff X-Frame-Options:同源 X-Request-Id:c70d4715-dcff-4558-85af-9d21556d406a X-Runtime:0.553353 X-Xss-Protection:1;模式=块

请求Headers: 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q= 0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:en-US,en;q=0.8,fr;q=0.6,he;q=0.4 Cache-Control:max-age=0 Connection:keep-还活着 Host:localtest.me:3000 If-None-Match:W/"1f1b2d0b822830bc74e7c47a116205be" Upgrade-Insecure-Requests:1 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like壁虎)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

好吧,headers 很好,它只是衡量浏览器如何处理重新加载按钮或快捷键的标准。

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

以下是 chrome 中的发现:

  1. 在地址栏上按 Enter 表示 "max-age" 并且 不会向服务器发送 请求。
  2. 重新加载按钮或 Cmd+R 向服务器发送一个请求 If-Modified-Since 并且 return 304 如果资源未被修改自...
  3. Cmd+Shift+R 向服务器发送一个请求甚至没有If-Modified-Since