让最新版的Discourse吃上Speculation加速

简单速记一下我搞了两个来小时的心得。涉及知识点还是有点密,专业术语和背景知识自己去了解。

Discourse新版迷之自信,强制给CSP(Content-Security-Policy)头里塞下了个 'strict-dynamic',今天一切的坑都是它导致的。

Cloudflare 新增了对 Speculation API 的支持,在 速度优化内容优化 里开启:

我看到后立刻就打开了,来到论坛一看,CSP给拦了。我心说这个东西去设置一下就好了,结果你猜怎么着?Cloudflare 通过 Speculation-Rules 响应头来指定的地址,而不是使用 <script type="speculationrules"> 来嵌入,也就无法使用 'inline-speculation-rules' 来放过(事实上Discourse你要设置这个也要改代码,他们写的很死)。

Discourse新版本强制 'strict-dynamic' 给它拦的死死的,强制必须要 noncehash,设置地址或 '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 也可以。

255 个赞

我来~~始皇牛逼

8 个赞

neo发货啊,这下L站更丝滑了

3 个赞

看不懂,学习来了

1 个赞

前排围观学习

5 个赞

前排围观学习

前排围观支持一下 !

2 个赞

P0,速度发徽章:crazy_face::crazy_face:

1 个赞

膜拜膜拜
e415f72201d585ac7ccc869a334048006d2b6b9d

1 个赞

始皇牛逼:cow::cow:

你们真快呀,这我都没抢到前排

前排学一下 :tieba_022:

每天一个技巧系列

最近活有点密呀?

原来是这样,我还以为要施工加新东西了

我刚把公司里的nginx_lua下了…
不过内部用的Discourse很久没更新了所以不担心这个问题
始皇是追着最新版更新的?

牛逼,你怎么这么强

后排学习:new_moon_with_face:(ง•̀_•́)ง

虽然没看懂 但是想问问是不是操作了一波之后访问论坛的速度已经变快啦

前排,neo不用上班嘛