返回
创建于
状态
公开

在 Next.js 中,当你设置了 COOP (Cross-Origin-Opener-Policy)COEP (Cross-Origin-Embedder-Policy)(即你在代码中设置的 same-originrequire-corp)后,浏览器会进入**跨源隔离(Cross-Origin Isolated)**模式。

这种模式是为了启用 SharedArrayBuffer 或高精度计时器等特性,但代价是:所有跨域资源必须明确允许被嵌入

要解决访问跨域资源(图片、脚本、API 等)的问题,你可以根据场景采取以下方案:


1. 客户端方案:为 HTML 标签添加 crossorigin

对于静态资源(如 <img>, <video>, <script>),你需要在 HTML 标签上添加 crossorigin 属性。

javascript
1// 在 React / Next.js 组件中
2<img 
3  src="https://external-domain.com/image.png" 
4  crossOrigin="anonymous" 
5/>

2. 服务端方案:跨域资源需要配置 CORP 响应头

这是最根本的解决方法。被请求的第三方资源服务器必须在其响应头中包含 Cross-Origin-Resource-Policy (CORP),否则浏览器会拦截加载。

响应头取值作用
CORPcross-origin最常用。允许任何网站嵌入该资源。
CORPsame-site仅允许同一父域下的站点嵌入。

注意: 如果你无法控制第三方服务器(例如某个公共 API 或 CDN),你只能通过自己的后端做代理。


3. API 请求方案:CORS 配置

对于 fetchaxios 发起的异步请求,除了常规的 CORS 配置外,确保响应头包含以下内容:

http
1Access-Control-Allow-Origin: * (或你的域名)

4. 绕过方案:使用 credentialless (较新)

如果你觉得 require-corp 限制太死,可以将 Cross-Origin-Embedder-Policy 修改为 credentialless

javascript
1// 修改你的代码
2response.headers.set('Cross-Origin-Embedder-Policy', 'credentialless');
  • 效果: 跨域资源不需要 CORP 响应头也能加载,但在加载时不会携带 Cookie 等凭证(Credentials)。这在兼容性允许的情况下是更灵活的选择。

总结建议

如果你是为了在 Next.js 中使用某些高性能 Web 内容(如 WebAssembly 线程):

  1. 如果你能控制资源服务器: 给资源加上 Cross-Origin-Resource-Policy: cross-origin
  2. 如果你不能控制资源服务器: * 尝试将 COEP 设置为 credentialless
    • 或者通过 Next.js API Routes 编写一个简单的 Proxy,手动获取资源并转发。