You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 11:解决视图模板无法访问CSP自定义$nonce的问题

Laravel 11中CSP中间件共享Nonce到视图的未定义变量问题解决

可能的原因及解决方案

1. 调整中间件执行逻辑顺序

必须在处理请求前完成nonce的生成与视图共享,再执行后续请求流程(包括视图渲染)。如果在$next($request)之后才调用view()->share,视图渲染时变量还未注入,就会触发未定义错误。

修正后的中间件代码:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class ContentSecurityPolicy
{
    public function handle(Request $request, Closure $next)
    {
        // 先生成nonce并全局共享给视图
        $nonce = bin2hex(random_bytes(16));
        view()->share('nonce', $nonce);

        // 执行后续请求处理(路由匹配、视图渲染等)
        $response = $next($request);

        // 最后设置CSP响应头
        $cspRules = [
            "default-src 'self'",
            "script-src 'nonce-$nonce' 'self'",
            // 按需添加其他CSP规则
        ];
        $response->headers->set('Content-Security-Policy', implode('; ', $cspRules));

        return $response;
    }
}

2. 确认中间件注册到正确路由组

Laravel 11中,若将中间件注册到错误的路由组(比如api组而非web组),web请求不会触发该中间件,视图自然无法获取nonce。

在bootstrap/app.php中,将中间件添加到web组:

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->web([
            \App\Http\Middleware\ContentSecurityPolicy::class,
            // 保留其他默认web中间件顺序
        ]);
    })
    ->create();

若需要全局生效(所有请求),可改为:

$middleware->add(\App\Http\Middleware\ContentSecurityPolicy::class);

3. 清除Blade视图缓存

视图缓存可能导致变量无法实时更新,执行以下命令清除缓存:

php artisan view:clear

4. 验证中间件是否被触发

在中间件handle方法中添加日志输出,确认中间件是否执行:

\Log::info('CSP middleware executed, nonce: ' . $nonce);

查看storage/logs/laravel.log,若没有相关日志,说明中间件未被正确注册或路由未关联该中间件组。


内容的提问来源于stack exchange,提问作者Code28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:55:06