同时具有gZip和ETag时无法缓存资源 [英] Cant cache resource when having both gzip and Etag

查看:29
本文介绍了同时具有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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆