当流量通过 Cloudflare 代理时,macOS 和 iOS 设备上的 Safari 可能无法加载 MP4 视频文件。
此问题发生是因为 Safari 处理 HTTP range 请求的方式与其他浏览器不同,特别是在视频流式传输期间处理 ETag 的方式。
Safari 和 iOS 设备依赖 HTTP range 请求来支持视频功能,例如跳转到特定时间戳和恢复中断的下载。
当 Cloudflare 的缓存层使用弱 ETag 处理这些 range 请求时,Safari 可能完全拒绝缓存响应,导致视频无法加载或显示为黑屏。
要解决此问题,请按以下顺序配置两条缓存规则。
创建缓存规则,应用于所有 MP4 文件,将其标记为符合缓存条件,并开启 Respect Strong ETags 设置。
-
在 Cloudflare 仪表板中,前往 Cache Rules(缓存规则) 页面。
Go to Cache Rules ↗ -
选择 Create rule(创建规则) > Cache rules(缓存规则)。
-
在 Rule name(规则名称) 中输入规则的描述性名称。
-
在 When incoming requests match…(当传入请求匹配时…) 部分,创建应用于所有 MP4 文件的筛选器,例如
URI FullWildcard*.mp4。 -
在 Cache eligibility(缓存资格) 部分选择 Eligible for cache(符合缓存条件)。
-
为 Respect strong ETags(遵循强 ETag) 选择 + Add Setting(添加设置) 并开启开关。
-
选择 Last(最后) 作为 Place at(放置位置)。
创建另一条应用于所有 MP4 文件并完全绕过缓存的缓存规则。
-
在 Cloudflare 仪表板中,前往 Cache Rules(缓存规则) 页面。
Go to Cache Rules ↗ -
选择 Create rule(创建规则) > Cache rules(缓存规则)。
-
在 Rule name(规则名称) 中输入规则的描述性名称。
-
在 When incoming requests match…(当传入请求匹配时…) 部分,创建相同的 MP4 文件筛选器,例如
URI FullWildcard*.mp4。 -
在 Cache eligibility(缓存资格) 部分选择 Bypass cache(绕过缓存)。
-
选择 Last(最后) 作为 Place at(放置位置)。
第一条规则为 MP4 文件保留 strong ETag,满足 Safari 对 range 请求处理的要求。第二条规则绕过缓存,使 Cloudflare 将 range 请求转发到源站服务器,而不是提供可能 ETag 不匹配的缓存响应。
第一条规则必须出现在 Cache Rules 列表中第二条规则之上。