本文目录导读:

在 PHP 中设置 COOP(Cross-Origin-Opener-Policy)和 COEP(Cross-Origin-Embedder-Policy)头,通常是为了启用跨源隔离(Cross-Origin Isolation),这可以提升网站的安全性,并允许使用一些强大的浏览器功能(如 SharedArrayBuffer)。
以下是在 PHP 中设置这些响应头的几种方法:
使用 header() 函数(最简单直接)
之前,调用 header() 函数。
<?php
// 必须在任何 HTML 输出之前设置
header('Cross-Origin-Opener-Policy: same-origin');
header('Cross-Origin-Embedder-Policy: require-corp');
// 你的页面内容
echo "Hello, world!";
?>
常用组合值:
- COOP:
same-origin(最严格,用于隔离)或same-origin-allow-popups。 - COEP:
require-corp(要求跨源资源必须携带 CORS 头)或credentialless(较宽松,但兼容性稍好)。
通过 .htaccess(Apache 服务器)
如果你使用 Apache 且希望全局或针对特定目录生效,可以在 .htaccess 中添加:
<IfModule mod_headers.c>
Header always set Cross-Origin-Opener-Policy "same-origin"
Header always set Cross-Origin-Embedder-Policy "require-corp"
</IfModule>
注意:如果服务器使用 Nginx,则在配置文件中添加 add_header 指令。
通过 PHP 框架中间件(推荐)
如果你使用 Laravel、Symfony 等框架,不推荐在控制器里逐个写 header(),建议使用中间件统一处理。
Laravel 示例(中间件)
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CrossOriginIsolation
{
public function handle(Request $request, Closure $next)
{
$response = $next($request);
$response->headers->set('Cross-Origin-Opener-Policy', 'same-origin');
$response->headers->set('Cross-Origin-Embedder-Policy', 'require-corp');
return $response;
}
}
然后在 app/Http/Kernel.php 中注册中间件。
注意事项(非常重要)
设置 COEP: require-corp 可能会导致页面上的跨源资源(如图片、脚本、CSS)加载失败,因为它们必须提供 CORS 头(或其他允许的响应头)。
如果你的页面引用了外部 CDN 资源(例如第三方图片或字体),而这些资源没有返回正确的 CORS 头,你需要:
- 给跨源资源添加
crossorigin属性(如<img crossorigin="anonymous" src="...">)。 - 确保资源服务器返回正确的 CORS 响应头(
Access-Control-Allow-Origin)。
如果你不确定是否真的需要跨源隔离,请谨慎设置 COEP,因为它可能破坏网站功能。
检测是否生效
设置后,可以在浏览器开发者工具(F12)-> Network 标签中,点击任意一个请求,查看 Response Headers,确认是否包含 Cross-Origin-Opener-Policy 和 Cross-Origin-Embedder-Policy。
COOP 和 COEP 都设置成功,在控制台输入 window.crossOriginIsolated,返回 true 表示跨源隔离已生效。