问题描述

近日我使用 hugo 构建了我的博客,并通过 Github Action 将其发布在 Github Pages 上,刚开始还是很美好的,但是过一短时间以后打开页面发现样式全无,使用浏览器的开发者工具查看资源获取没有问题,但是在控制台却出现了这样一句话:

Failed to find a valid digest in the 'integrity' attribute for resource '***' with computed SHA-256 integrity '***'. The resource has been blocked.

寻找原因

我在 MDN 上寻找到了关于 integrity 的定义,大概描述就是这是一个签名,浏览器获取到相应资源后会用相同的方法计算一个签名,只有签名相同时才会加载对应的资源,如果两个签名不一致则是文件完整性被破坏(文件发生了改变)。

问题来了,整个发布过程是由 Github Action 全自动操作的,没有人为干预,文件为何会无缘无故改变呢?

答案是 Cloudflare。 Cloudflare 中默认会开启静态资源的缓存来提高网站的加载速度,可是为什么缓存会改变文件呢?缓存并不会改变文件,在 Cloudflare 的 Speed > Optimization 中有一个叫 Auto Minify 的选项,描述如下:

Reduce the file size of source code on your website.

Note: Purge cache to have your change take effect immediately.

这句话翻译过来就是 减小网站源代码文件体积的大小 ,同时该选项有 3 个子选项:

  • JavaScript
  • CSS
  • HTML

默认都是选中状态,即默认会压缩我们的 js,css 和 html 文件。

解决问题

因为我们网站是 css 文件的签名验证出现了问题,因此我们取消 Auto Minify 下面的 Css 选项,然后在Caching > Configuration 中点击 Purge Cache 清除缓存,回到网站使用 ctrl + F5 强制刷新网页,问题解决。

其他解决方案

我使用的是 PaperMod 主题,可以在配置中关闭校验:

config.yaml

params:
  assets:
    disableFingerprinting: true

关闭校验后在生成页面的时候 css 文件引用就不会有 integrity 属性

结束语

遇到困难仔细分析,终会迎刃而解。