Laravel 12中如何为Folio路由禁用会话与中间件?
你遇到的核心问题是:Folio默认继承了Laravel web路由组的中间件栈,其中包含会话、CSRF相关中间件——即使你在Folio配置里没手动添加中间件,这些默认中间件依然会生效。全局移除这些中间件会导致整个应用依赖会话的功能崩溃,所以需要针对Folio路由单独处理。
方案一:给Folio单独排除不需要的中间件
直接在FolioServiceProvider的boot方法中,用withoutMiddleware排除会话、CSRF相关中间件,不影响其他路由:
public function boot(): void { Folio::path(resource_path('views/pages')) ->middleware([ '*' => [ // 这里可以添加公开页面需要的中间件(比如CORS),不需要的留空 ], ]) ->withoutMiddleware([ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, ]) ->uri('/'); }
方案二:给Folio注册独立的空中间件组
如果希望Folio完全脱离默认web中间件栈,可以创建一个空的中间件组,让Folio使用它:
- 在
bootstrap/app.php的withMiddleware中定义空组:
->withMiddleware(function (Middleware $middleware) { // 定义一个无任何中间件的组,供公开页面使用 $middleware->group('public', []); })
- 修改
withRouting,指定Folio使用这个空组:
->withRouting( commands: __DIR__.'/../routes/console.php', web: __DIR__.'/../routes/web.php', // 单独配置Folio路由 folio: [ 'path' => resource_path('views/pages'), 'middleware' => 'public', 'uri' => '/', ], health: '/up', )
为什么全局移除会报错?
Laravel的web路由组默认绑定了包含会话、CSRF的中间件栈,全局移除这些中间件后,整个应用的所有请求都没有会话上下文。如果有其他路由(比如默认的web路由)或者代码尝试访问会话(比如错误提示里的逻辑),就会抛出Session store not set on request的异常。因此绝对不要全局移除这些核心中间件,只针对不需要的路由单独排除即可。
验证效果
启动应用后,访问Folio的公开页面,查看响应头:如果不再出现laravel_session和XSRF-TOKEN的Cookie,说明配置生效。
内容的提问来源于stack exchange,提问作者m90
相关产品推荐
相关产品推荐

