中间件未生效是因为spatie csp包需手动注册:在app/http/kernel.php的$middlewaregroups['web']或['api']中添加\spatie\csp\addcspheaders::class,不可加至全局$middleware;配置需宽松起步、逐步收紧,启用report_uri接收违规报告,并注意vite代理透传响应头问题。

composer require spatie/laravel-csp 后中间件没生效?
装完包,php artisan vendor:publish 也跑了,但请求头里压根没出现 Content-Security-Policy —— 大概率是中间件没注册。Spatie 的 CSP 包默认不自动注册中间件,得手动加。
- 打开
app/Http/Kernel.php,在$middlewareGroups['web']或$middlewareGroups['api']里补上\Spatie\Csp\AddCspHeaders::class - 别加错位置:加在「路由中间件组」里,不是全局中间件(
$middleware);否则 API 请求也会被塞 CSP,可能误杀前端资源加载 - 如果用的是 Laravel 10+,注意中间件类名是否带命名空间前缀;新版 Spatie 包的类路径是
\Spatie\Csp\AddCspHeaders,不是旧版的Spatie\LaravelCsp\AddCspHeaders
config/csp.php 里 default_policy 怎么配才不崩前端?
直接用默认配置上线,大概率白屏或 JS/CSS 加载失败。CSP 是“白名单机制”,写宽了没意义,写严了直接挂掉页面。
- 开发阶段先设成宽松策略:
'default-src' => "'self' http: https:",再逐步收紧 - 内联脚本(
<script>console.log(...)</script>)默认被禁,要用'script-src' => "'self' 'unsafe-inline'"临时放行,但上线前必须改掉——换成nonce或哈希值 - Vue/React 等框架常依赖
eval(),需显式加'unsafe-eval',但这是高危项,仅限调试;生产环境应关掉并启用strict-dynamic - CDN 资源(如 jQuery、字体)要逐个写进对应指令,比如
'font-src' => "'self' fonts.googleapis.com fonts.gstatic.com"
怎么让 CSP 报告发到自己的接口?
光加响应头不够,得让浏览器把违规行为上报回来,否则你根本不知道策略哪里写错了。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在
config/csp.php的report_only设为false(确保策略生效),同时填上report_uri,比如'report_uri' => '/csp-report' - 后端必须定义一个 POST 路由接收报告:
Route::post('/csp-report', [CspReportController::class, 'store'])->withoutMiddleware(['VerifyCsrfToken'])—— CSRF 中间件会拦截纯 JSON 上报 - 浏览器发来的报告是 JSON,但 Content-Type 常为
application/csp-report,Laravel 默认不解析;要在控制器里用file_get_contents('php://input')手动读取原始体 - 别忘了给报告接口加日志或存储,否则上报了你也看不到
本地开发用 Vite + HTTPS 代理时 CSP 头消失?
Vite 开发服务器反向代理 Laravel 接口,但代理默认不透传响应头,Content-Security-Policy 就被吞了。
- 检查 Vite 配置里的
server.proxy,确认是否设置了changeOrigin: true和secure: false(本地 HTTPS 代理必需) - 更关键的是:Vite 代理默认不转发自定义响应头;需在 proxy 配置中显式加
headers: { 'Content-Security-Policy': '...' }—— 但这不现实,因为策略是动态生成的 - 推荐解法:开发时暂时关掉 CSP(
config/csp.php中设enabled => env('APP_DEBUG', false)),或改用 Laravel Valet / DDEV 等本地环境直连 PHP,绕过 Vite 代理
真正麻烦的不是配 CSP,而是每换一个第三方 SDK、每加一段内联代码、每切一次部署环境,策略就得重新验证一遍。漏一条 connect-src,埋点就失效;少一个 nonce,登录页就卡住。它不像日志或缓存,出问题不会报错,只会静默失败。










