简单速记一下我搞了两个来小时的心得。涉及知识点还是有点密,专业术语和背景知识自己去了解。
Discourse新版迷之自信,强制给CSP(Content-Security-Policy)头里塞下了个 'strict-dynamic',今天一切的坑都是它导致的。
Cloudflare 新增了对 Speculation API 的支持,在 速度 → 优化 → 内容优化 里开启:
我看到后立刻就打开了,来到论坛一看,CSP给拦了。我心说这个东西去设置一下就好了,结果你猜怎么着?Cloudflare 通过 Speculation-Rules 响应头来指定的地址,而不是使用 <script type="speculationrules"> 来嵌入,也就无法使用 'inline-speculation-rules' 来放过(事实上Discourse你要设置这个也要改代码,他们写的很死)。
Discourse新版本强制 'strict-dynamic' 给它拦的死死的,强制必须要 nonce 或 hash,设置地址或 'self' 直接忽略。但问题是 Speculation-Rules 响应头是没法支持这样的。
我试图去 cf 里配置响应头动态规则,替换掉 'strict-dynamic' 结果告诉我 regex_replace 函数要 Business 套餐才能使用。最后使用 Pro 套餐支持的 Snippets 给替换掉了,代码如下:
export default {
async fetch(request) {
const response = await fetch(request);
const newResponse = new Response(response.body, response);
let csp = newResponse.headers.get("content-security-policy");
if (csp) {
const newCSP = csp.replace(" 'strict-dynamic'", " 'self'");
newResponse.headers.set("content-security-policy", newCSP);
}
return newResponse;
}
};
简单来说就是拿掉 'strict-dynamic' 替换成 'self',问题得到解决。
感觉真就麻烦!中间因为折腾CSP导致一些静态资源被拒绝加载,页面一度异常。
这里面专业名词和含义自行搜索吧。没有 Pro 计划用 worker 什么的吧,或者 nginx_lua 也可以。


