zrz*_*zrz 10 cache last-modified apache-2.4
我试图对我的缓存策略有一个基本的行为:文件应该被缓存,并且每次都与服务器重新验证。所以我希望 Apache 发回 304。
这是每次浏览器刷新时发生的对话框:
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...
Host:...
If-Modified-Since:Tue, 14 Oct 2014 15:10:37 GMT
If-None-Match:"1461-505636af08fcd-gzip"
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Response Headers
Accept-Ranges:bytes
Cache-Control:No-cache
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1412
Content-Type:text/html
Date:Tue, 14 Oct 2014 16:58:05 GMT
ETag:"1461-505636af08fcd-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Tue, 14 Oct 2014 15:10:37 GMT
Server:Apache/2.4.6 (Ubuntu)
Vary:Accept-Encoding
Run Code Online (Sandbox Code Playgroud)
(这是来自 chrome devtools,未选中禁用缓存)
您可以看到响应包含 Cache-Control:No-cache 标头,并且 If-modified-since 标头与 Last-modified 相匹配。ETag 也匹配。
在这种情况下,Apache 不应该发送 304 吗?
编辑
在 apache 中禁用 ETags
Header unset ETag
Run Code Online (Sandbox Code Playgroud)
使缓存行为更可预测...
这似乎是一个老错误,解释了为什么Header unset ETag
会有所不同。
Apache 2.4.0+ 自动将压缩方法名称附加到 ETag(如您的标头中所示),并防止 304 响应。
最新版本的 mod_deflate 支持可用于控制此行为的DeflateAlterETag:
DeflateAlterETag NoChange
Run Code Online (Sandbox Code Playgroud)
这个在请求中显得有点奇怪:
Cache-Control:max-age=0
Run Code Online (Sandbox Code Playgroud)
但可能更重要的是,我注意到返回的内容是 html。是动态生成的吗?Apache 可以发送 304 响应,但除非您提供静态内容,否则进行该调用不是 Apache 的工作,这取决于您的应用程序逻辑。例如,大多数 php 应用程序对此类事物的支持有限。
前端缓存可能会有所帮助,因为缓存应用程序可以检查修改时间、etag 等,但前提是应用程序和请求标头都是缓存友好的。例如,应用程序必须设置适当的标头来指示内容是可缓存的,并且请求中的 Cache-control 标头之类的内容将取消缓存。您的标头看起来对缓存不友好。
归档时间: |
|
查看次数: |
10375 次 |
最近记录: |