同时具有gZip和ETag时无法缓存资源 [英] Cant cache resource when having both gzip and Etag
本文介绍了同时具有gZip和ETag时无法缓存资源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试在浏览器中缓存(Javascript)资源,并且已在响应标头中正确设置了所有Cache-control:Max-age、Expires和ETag(如屏幕截图所示)。
浏览器请求IF-NONE-MATCH和IF-MODIFIED-SIGN,两种情况都满足条件:
- If-Modified-Self=Last-Modified(文件从未更改)
- If-None-Match=ETag(同样,文件从未更改过)
所以我应该得到响应304,对吗?但是没有,我一直得到200OK,这意味着Apache每次都会继续为文件提供服务(尽管是压缩的)。在Firefox、Chrome、CURL上测试过--没有用。服务器始终为整个文件提供服务,即使我没有要求它.
使用curl,我已将问题跟踪到gzip&;Etag:
- 如果我删除gzip(并从请求ETag中删除后缀-gzip)--一切正常:304
- 如果我保留gzip并完全删除请求ETag--一切正常:304
- 但是如果我同时保留‘Accept-Coding:gzip’和ETag,即使请求和响应eTag是相同的(这次是‘-gzip’结尾),服务器也会返回错误的200。感觉就像Apache在对失败进行gzip之前比较ETag,确定它不匹配,然后提供gzip文件,即使在gzip之后ETag匹配。
以下是请求/响应:
- 请求方法:GET
- 状态码:HTTP/1.1 200正常
请求头00:09:12.000
- 用户代理:Mozilla/5.0(X11;Ubuntu;Linux i686;RV:36.0) Gecko/20100101 FIREFOX/36.0.
- If-None-Match:"24e55-51138062ce6c0-gzip"
- 如果修改-自:星期六,2015年3月14日格林尼治标准时间04:26:43
- 连接:保持连接
- 缓存控制:max-age=0
- 接受语言:EN-US,EN;Q=0.5
- Accept-Ending:GZIP、DEFEATE
- 接受:/
响应标头Δ1100ms
- Variable:接受-编码
- 服务器:apache/2.4.7(Ubuntu)
- 上次修改时间:星期六,2015年3月14日04:26:43 GMT
- Keep-Alive:超时=5,最大值=100
- 到期时间:2015年3月25日16:09:13格林尼治标准时间
- ETag:"24e55-51138062ce6c0-gzip"
- 日期:星期三,2015-03-18 16:09:13格林尼治标准时间
- 内容类型:应用程序/Java脚本
- 内容长度:53331
- 内容编码:GZIP
- 连接:保持连接
- 缓存控制:Max-Aage=604800
推荐答案
正在为每个实体创建唯一的ETag URL的特定实体变量。每个协商的变体都需要有唯一的ETag:s。对于mod_deflate
,只需将编码添加到已计算的ETag即可。
一种解决方法是从ETag:
中删除编码<Location /js>
RequestHeader edit "If-None-Match" "^(.*)-gzip$" "$1"
Header edit "ETag" "^(.*[^g][^z][^i][^p])$" "$1-gzip"
</Location>
如果您使用的是带有mod_deflate
模块的Apache2.5,则可以使用指令DeflateAlterETag
指定在压缩响应时应如何更改ETag Hader。
DeflateAlterETag AddSuffix|NoChange|Remove
来源:https://httpd.apache.org/docs/trunk/mod/mod_deflate.html#deflatealteretag
此blog post建议完全删除eTag并依赖Cache-Control
标头。
在httpd.conf
中执行此操作:
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
请注意,如果实体gzip:ed bymod_deflate
仍然携带与普通实体相同的ETag,这可能会导致支持ETag的代理缓存中的不一致。
此处提供更多信息:
这篇关于同时具有gZip和ETag时无法缓存资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文