Cloudflare 不转发 ETag 标头?

Posted

技术标签:

【中文标题】Cloudflare 不转发 ETag 标头?【英文标题】:Cloudflare not forwarding ETag header? 【发布时间】:2016-10-28 07:46:36 【问题描述】:

我有一个使用 Cloudflare 的网站(例如 http://example.com)。没什么特别的,没有奇怪的页面规则,没有奇怪的设置,免费计划。

当我转到 http://example.com 时,我收到了 GET http://example.com 请求的响应:

Cache-Control:no-cache, must-revalidate
CF-RAY:2b8d0490837f2828-SJC
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=UTF-8
Date:Sun, 26 Jun 2016 01:52:05 GMT
Expires:0
Pragma:no-cache
Server:cloudflare-nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:Express

请注意,响应没有 ETag 标头,即使它已在我的源服务器上启用。

当我直接访问源服务器时,例如GET http://01.23.456.789/,我得到这个回复:

Accept-Ranges:bytes
Cache-Control:no-cache, must-revalidate
Connection:keep-alive
Date:Sun, 26 Jun 2016 01:56:53 GMT
ETag:W/"4cf8-1558a5557a0"
Expires:0
Pragma:no-cache
X-Powered-By:Express

有谁知道为什么 如何让 Cloudflare 转发 ETag? Cloudflare 默认不缓存 GET http://example.com 请求,因为它是一个 HTML 页面。

【问题讨论】:

这看起来是个有趣的问题,您能否给 supportATcloudflareDOTcom 发送电子邮件,以便我们帮助您解决这个问题? 由于这种奇怪的 Cloudflare 行为,我损失了一整天... 【参考方案1】:

我与 Cloudflare 技术支持工程师交谈,他帮助解决了我的问题。对于将来可能遇到同样问题的任何人,以下是解决此问题的方法:

我为有问题的 URL 启用了电子邮件混淆(删除了其 ETag 标头)。根据https://support.cloudflare.com/hc/en-us/articles/218505467-Does-CloudFlare-support-ETag-headers-,

Email Obfuscation will need to be disabled, otherwise the ETag headers
will be removed from the response. Email Obfuscation modifies the code
significantly enough it cannot be considered semantically equivalent.

不过,禁用电子邮件混淆仍然没有解决问题。原来我启用了一个可以修改 HTML 的应用程序,因此必须使 ETag 无效。最后,为该 URL 设置一个禁用安全性、禁用应用程序、禁用性能的页面规则就可以了。

【讨论】:

在我的情况下,如文档中所述,禁用电子邮件混淆和自动 HTTPS 重写就足够了 您还需要在速度 - 优化 - 自动缩小中禁用自动缩小【参考方案2】:

禁用电子邮件混淆和自动 HTTPS 重写,如 Cloudflare support 中所述:

使用弱 ETag 标头时,禁用电子邮件混淆和自动 HTTPS 重写 以确保 Cloudflare 不会删除 ETag 标头 由您的源站 Web 服务器设置。

【讨论】:

【参考方案3】:

就我而言,我遇到了同样的情况。 禁用电子邮件混淆和自动 HTTPS 重写对我来说还不够,因为我在 Cloudflare 应用程序上安装了“更好的浏览器”应用程序 (https://www.cloudflare.com/apps/a-better-browser)。 卸载该应用后,Etag 会出现。

【讨论】:

以上是关于Cloudflare 不转发 ETag 标头?的主要内容,如果未能解决你的问题,请参考以下文章

ETag 和 If-None-Match HTTP 标头不起作用

Chrome 会忽略 ETag 标头,只使用内存缓存/磁盘缓存

ETag 与标头过期

什么优先:ETag 或 Last-Modified HTTP 标头?

在播放结果上设置 HTTP 标头(如过期) - 以及如何处理 ETag?

Cloudflare 为 Cloudflare 页面去除自定义域上的标头