Vla*_*mir 13 caching header http response
我正在尝试在浏览器中缓存(javascript)资源并正确设置响应标头中的所有Cache-control:max-age,Expires和Etag(如屏幕截图所示).
浏览器请求"if-none-match"和"if-modified-since",并且在这两种情况下满足条件:
所以我应该得到回复304,对吗?但不,我一直得到200 OK,这意味着apache每次都会继续为文件服务(尽管是压缩的).经过Firefox,Chrome,curl测试 - 没用.服务器总是服务整个文件,即使我没有要求它...
使用curl,我已经将问题追溯到gzip和Etag:
这是请求/响应:
请求标题00:09:12.000
响应标头Δ1100ms
nul*_*ull 10
Apache mod_deflate正在为每个实体创建唯一的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>
Run Code Online (Sandbox Code Playgroud)
如果您将Apache 2.5与mod_deflate模块一起使用,则可以使用该指令DeflateAlterETag指定在压缩响应时如何更改ETag hader.
DeflateAlterETag AddSuffix|NoChange|Remove
Run Code Online (Sandbox Code Playgroud)
资料来源:https://httpd.apache.org/docs/trunk/mod/mod_deflate.html#deflatealteretag
这篇博文建议完全删除Etags并依赖Cache-Control标题.
要做到这一点httpd.conf:
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
Run Code Online (Sandbox Code Playgroud)
请注意,如果实体gzip:ed mod_deflate仍然带有与普通entiy相同的ETag,则可能导致ETag感知代理缓存中的不一致.
更多信息:
我强烈怀疑Cache-Control: max-age=0是有问题的。
引用这篇文章及其优秀的答案:What's the Difference Between Cache-Control: max-age=0 and no-cache?
另一方面,使用 Cache-Control: no-cache(又名“端到端重新加载”)发送请求不会重新验证,并且服务器在响应时不得使用缓存副本。
| 归档时间: |
|
| 查看次数: |
6441 次 |
| 最近记录: |