必须通过服务端响应头强制开启,仅靠前端代码或HTML属性无法启用crossOriginIsolated;self.crossOriginIsolated为false的根本原因是HTML响应头中缺失Cross-Origin-Embedder-Policy: require-corp和Cross-Origin-Opener-Policy: same-origin二者之一或全部,且<meta>、<script>动态设置及file://协议均无效。

必须通过服务端响应头强制开启,仅靠前端代码或 HTML 属性无法启用 crossOriginIsolated。
为什么 self.crossOriginIsolated 总是 false
常见现象是写了 if (self.crossOriginIsolated) { ... } 却始终进 else 分支——这不是 JS 写错了,而是页面根本没被浏览器识别为跨域隔离状态。
- 判断依据只有一条:HTML 响应头中必须同时存在
Cross-Origin-Embedder-Policy: require-corp和Cross-Origin-Opener-Policy: same-origin - 缺一不可;顺序无关;大小写敏感(必须全小写)
-
<meta http-equiv>无效,<script>动态设置 header 无效,服务端未返回即视为未开启 - 本地直接双击打开的
file://页面永远无法满足条件
Express.js 中正确添加隔离头
Express 默认不透传这些 header,需显式调用 res.set() 或 res.header(),且必须在 res.send() 之前执行。
- 不能只对 API 路由加,必须对 HTML 文档主响应(通常是
GET /或GET /index.html)加 - 中间件里加时,注意是否被后续路由或静态文件中间件覆盖(如
express.static()不会自动继承 header) - 示例代码:
app.get('/', (req, res) => { res.set('Cross-Origin-Embedder-Policy', 'require-corp'); res.set('Cross-Origin-Opener-Policy', 'same-origin'); res.sendFile(path.join(__dirname, 'index.html')); });
nginx 配置容易漏掉的关键点
很多人照抄配置却失败,问题常出在 location 匹配范围或缓存干扰上。
立即学习“前端免费学习笔记(深入)”;
- 必须作用于 HTML 返回路径,例如
location = / { ... }或location /index.html { ... },而不是笼统的location /(可能被 proxy_pass 覆盖) - 如果用了 CDN 或反向代理(如 Cloudflare),确保这些中间层没有 strip 或重写这两个 header
- 加完后用浏览器 DevTools 的 Network → Headers 标签页确认响应头真实存在,而非仅看 nginx 配置文件
- 若页面由多个子资源(如 iframe、worker)组成,所有嵌入的资源也需满足 CORP(比如 iframe 的 src 页面同样要带
require-corp)
真正难的不是加两行 header,而是整个资源链路(主页、iframe、Web Worker、imported script)都得同步满足隔离策略,漏掉任意一环,SharedArrayBuffer 或 performance.measureMemory 就会静默失效。



















