在我支持的网站上运行 ySlow,我注意到它报告说网站图像的 etags 配置错误(例如 *.jpg、*.png、*.gif)。任何人都可以帮助解释我必须做什么才能让 IIS7 正确发布这些 etags 吗?
我只是在WebPageTest.org上查看我们的网站,他们对加快网站速度的建议之一是:
通常不应使用 ETag 标头,除非您有明确的理由需要它们
我想知道这是什么意思。这是否意味着您知道不会更改的静态内容不应该包含它们,或者这是否意味着您知道将定期更改的内容不应该包含它们,或者是否意味着您不应该普遍使用它们,除非您有具体需要。
如果是后者,什么时候使用它们合适?
我正在为电子商务平台开发一个缓存系统,该系统将使用反向代理进行缓存。我计划通过使用正确的 HTTP/1.1 标头来处理失效。也就是说,我将在第一代内容上设置一个 ETag,并在应用程序中缓存该 ETag 值。Cache-Control 标头将指定“必须重新验证”,因此代理应在带有 ETag 的后续请求上设置 If-None-Match 标头。应用程序将查找缓存的 ETag 值,如果匹配将发送 304 响应,否则将生成完整的 200 响应。
我希望使用 nginx,但我不能确定它是否支持 ETag(文档表明它不支持,但也许它们已经过时了?)。清漆是另一种选择,但我在这里也不乐观..
哪些反向代理服务器完全支持 ETag?我希望它能够真正缓存多个版本,这样我就可以在不必禁用缓存的情况下进行拆分测试之类的操作。也就是说,HTTP/1.1 指定客户端可以发送带有多个 ETag 值的 If-None-Match,服务器应响应匹配的 ETag(如果有)。如果反向代理保留多个副本而不仅仅是最后看到的值,并让服务器在每个请求上指定要使用的值,那将是理想的。
我正在使用 ngnix 提供我的静态内容。
位置/静态{
别名 /opt/static/blog/;
access_log off;
etags 上;
etag_hash on;
etag_hash_method md5;
过期 1 天;
add_header Pragma "public";
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
生成的标题如下所示:
缓存控制:公共,必须重新验证,代理重新验证 缓存控制:最大年龄=86400 连接:关闭 内容编码:gzip 内容类型:应用程序/x-javascript;字符集=utf-8 日期:2012 年 9 月 11 日,星期二 08:39:05 GMT 标签:e2266fb151337fc1996218fafcf3bcee 到期:2012 年 9 月 12 日星期三 08:39:05 GMT 上次修改时间:2012 年 9 月 11 日,星期二 06:22:41 GMT 语用:公开 服务器:nginx/1.2.2 传输编码:分块 变化:接受编码
为什么 nginx 发送 2 个 Cache-Control 条目,这对客户端来说是一个问题吗?
我使用 Apache 2.4.3 作为反向代理,因为它宣传符合 RFC 2616。我的应用程序使用这样的标头来启用代理缓存:
Cache-Control: public, s-maxage=0
Expires: ... (+1 day)
X-Group: A
Vary: X-Group
ETag: W/"foo1"
Run Code Online (Sandbox Code Playgroud)
在第一个请求预热缓存后,如果我的应用程序更改为响应:
Cache-Control: public, s-maxage=0
Expires: ... (+1 day)
X-Group: B
Vary: X-Group
ETag: W/"foo2"
Run Code Online (Sandbox Code Playgroud)
如果来自 Apache 的 If-None-Match 标头与源生成的 ETag 匹配,则应用程序将响应 304 Not Modified。但是,Apache 然后缓存第二个 200 响应并用新响应替换“foo1”记录,而不是缓存具有不同 ETag 的两个响应。因此,而不是If-None-Match: W/"foo1", W/"foo2"下一个重新验证请求只是If-None-Match: W/"foo2". 所以缓存不断地丢失而不是总是得到命中。
来自 RFC 2616 第 12.1 节:
然而,源服务器不限于这些维度,可以根据请求的任何方面改变响应,包括请求头字段之外的信息或本规范未定义的扩展头字段内的信息。
我为 Vary 尝试了以下组合:
Vary: X-Foo
Vary: *
Vary: User-Agent
Run Code Online (Sandbox Code Playgroud)
我还尝试了强和弱 ETag,无论我无法让 Apache 同时缓存两个响应,它 …
我正在Azure CDN 上阅读这篇文章。我可以通过以下方式控制缓存:
前两种选择的优点和缺点是什么?有关系吗?
一个人可能工作的地方与另一个人可能工作的地方可能是:
...该数据要么通过这些方法可见,要么通过其他方法可见。
我正在使用nginx 的expires指令;它的etag指令以及Last-Modified标题(如果我理解正确的话)默认情况下处于打开状态。
为了在使用限制性内容安全策略(CSP)标头(即无'unsafe-inline'资源策略)时允许特定的内联 JavaScript,我想使用随机数。
我基本上遵循了Scott Helme 关于此事的文章,在我的试验中使用 nginx$request_id来创建nonce ServerFault 上讨论的内容(以便快速尝试,而不必从头开始构建 nginx)。
然而,当我尝试此操作时,缓存似乎不再按我的预期工作:
Nginx 每次都以文件、新鲜Last-Modified和ETag标头进行响应,而不是304 Not Modified我希望的响应。
仔细想想,这是有道理的:nonceCSP 标头以及源代码中的 都会随着每个请求而变化。然而,其他一切都没有改变。因此,可以说,这是“弱验证器”应该忽略的更改(从而将请求的资源标记为未更改)。
话虽如此,我对服务器配置或缓存标头知之甚少,甚至一无所知。很可能我所掌握的少量知识没有帮助,而且弱验证器无论如何也不应该以这种方式工作。
此外,似乎存在一个问题,即当浏览器拥有旧文件的缓存版本nonce但获得304 Not Modified新文件的标头时,浏览器会感到困惑nonce(尽管我自己在试用中没有看到这一点)。
因此,我的问题基本上是:是否可以配置nginx,以便缓存以某种方式工作,当nginx创建和标头(即它只看起来的地方)时,对唯一的更改(即通过文本替换动态发生的更改)nonce被忽略Last-ModifiedETag在磁盘上的文件更改时) - 有效地使用什么可能是弱验证器?
并且,假设浏览器混乱是一个问题,您是否可以采取一些措施来阻止它,例如当服务器返回 304 时不返回 CSP …
默认情况下,Tomcat 似乎为每个响应发送一个 ETag 标头。由于此处概述的原因,我想禁用这些。我知道我可以在我的 Apache 配置中删除它们,但是有什么方法可以在 Tomcat 端禁用它们吗?
etags ×8
http ×3
nginx ×3
cache ×2
apache-2.4 ×1
azure ×1
cdn ×1
http-caching ×1
http-headers ×1
iis-7 ×1
optimization ×1
page-speed ×1
performance ×1
tomcat ×1
varnish ×1
web ×1
web-server ×1
yslow ×1