Cross-Origin-Embedder-Policy 设置后图片加载失败怎么办?
我在项目里加了 Cross-Origin-Embedder-Policy: require-corp 这个安全头,结果页面上用 <img> 标签加载的第三方图片全挂了,控制台报错说需要 CORS 或者设置了 crossorigin 属性。但有些图源根本不支持 CORS,这咋办?
我试过在 React 里给 img 加 crossorigin=”anonymous”,但没用,还是被拦截。比如下面这段代码:
function Avatar({ src }) {
return (
<img
src={src}
alt="user avatar"
crossorigin="anonymous"
style={{ width: '50px', height: '50px' }}
/>
);
}
是不是只要用了 COEP,就完全不能加载非 CORS 的外部资源了?有没有折中方案?
加 crossorigin="anonymous" 没用,因为那个属性是告诉浏览器"我要用CORS请求",但如果服务器根本不返回 Access-Control-Allow-Origin 头,照样挂。
几个能走的路:
1. 用代理中转(最常用)
搞个服务端接口把第三方图片拉回来再返回给你前端,这样对浏览器来说就是同域请求了:
2. 改用 COEP: credentialless
如果不需要在跨域请求里带 cookie、证书这些凭证,可以把 require-corp 改成 credentialless,它允许跨域资源不带CORS也能加载,但会剥离 credentials:
这样图片能加载了,但如果你有其他跨域请求需要带凭证就不行。
3. 实在不行就不开 COEP
COEP 主要是为了配合 SharedArrayBuffer 这些高级API用的。如果你的应用不是必须用那些东西,光为了安全头没必要硬撑,COOP(Cross-Origin-Opener-Policy)单独用也能提升不少安全性。
一般情况我推荐方案1,代理虽然多了层转发,但最稳妥,图源那边你控制不了人家服务器配置。