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 中的发现:
- 在地址栏上按 Enter 表示 "max-age" 并且 不会向服务器发送 请求。
- 重新加载按钮或 Cmd+R 向服务器发送一个请求 If-Modified-Since 并且 return 304 如果资源未被修改自...
- Cmd+Shift+R 向服务器发送一个请求甚至没有If-Modified-Since
我无法使 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 中的发现:
- 在地址栏上按 Enter 表示 "max-age" 并且 不会向服务器发送 请求。
- 重新加载按钮或 Cmd+R 向服务器发送一个请求 If-Modified-Since 并且 return 304 如果资源未被修改自...
- Cmd+Shift+R 向服务器发送一个请求甚至没有If-Modified-Since