Cross-Origin-Embedder-Policy 设置后图片加载失败怎么办?
我在尝试启用 COEP(Cross-Origin-Embedder-Policy: require-corp)来配合 SharedArrayBuffer 使用,但设置之后发现页面里的跨域图片全挂了,控制台报错说需要 CORS 或 CORP 头。我试过给 img 加 crossorigin=”anonymous”,但第三方图床根本不支持 CORS,这不就死循环了吗?
这是我的简单测试页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>COEP Test</title>
</head>
<body>
<img src="https://example.com/image.jpg" crossorigin="anonymous" />
</body>
</html>
有没有办法在保持 COEP 的前提下正常加载这些外部图片?还是说我只能放弃用 SharedArrayBuffer?
解决这个问题有几种思路,不过都得权衡利弊。一种是联系图床管理员,看他们能不能给你开 CORS 特权,但这不一定行得通。另一种就是找一个支持 CORS 的图床,或者自己搭建一个。
还有一种方法是用代理服务器。你可以在自己服务器上写个简单的代理接口,前端请求这个接口,接口再去请求外部图片,然后把图片返回给前端。这样前端请求的就是同源的接口,就不会触发 COEP 策略了。
下面是一个简单的 Node.js 代理示例,你可以用 express 和 axios 来实现:
pre class="pure-highlightjs line-numbers">
const express = require('express');
const axios = require('axios');
const app = express();
app.get('/image-proxy', async (req, res) => {
try {
const response = await axios.get(req.query.url, { responseType: 'arraybuffer' });
res.set('Content-Type', response.headers['content-type']);
res.send(response.data);
} catch (error) {
res.status(500).send(error.message);
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
前端请求时改成这样:
这样就可以在保持 COEP 的同时加载跨域图片了。别走弯路,希望这个方法能帮到你。