Laravel-Livewire 多子域名多租户场景下如何自定义全局消息请求URL
Livewire 多租户子域名适配方案
问题场景
如下示例中使用自定义域名配置时,无法让 Livewire 请求自动加上相同的子域名前缀,本例中为 subdomain1:
Route::domain('subdomain1.'.env('APP_DOMAIN', 'localhost')) ->middleware(['web',.....]) ->as('app.') ->group(base_path('routes/app.php'));
问题原因
Livewire 默认的请求端点回调为 /livewire/message/{message},仅使用根域名,不会基于请求发起的域名适配,本例中请求是从 subdomain1 发起的,会导致会话存储不一致,本质上二者属于完全不同的会话。
因此子域名下的会话存储和根域名会话存储并不互通。多租户架构的项目需要做这类访问隔离,也需要基于不同子域名封装 Livewire 的使用逻辑。
修复步骤
- 覆盖 Livewire 默认路由,绑定到子域名路由组
将Livewire相关的核心接口放在子域名路由规则下即可自动适配请求前缀:
Route::domain('{tenant}.'.env('APP_DOMAIN', 'localhost')) ->middleware('web') ->group(function () { // 覆盖默认消息处理路由 Route::post('/livewire/message/{name}', '\Livewire\Controllers\HttpConnectionHandler@__invoke') ->name('livewire.message'); // 覆盖文件上传路由 Route::post('/livewire/upload-file', '\Livewire\Controllers\FileUploadHandler@handle') ->name('livewire.upload-file'); // 覆盖文件预览路由 Route::get('/livewire/preview-file/{filename}', '\Livewire\Controllers\FilePreviewHandler@handle') ->name('livewire.preview-file'); });
- 动态配置Livewire资产域名(可选)
如果子域名下需要单独加载Livewire静态资源,可以在服务提供者中动态设置资产根路径:
// 写入 App\Providers\AppServiceProvider 的 boot 方法 public function boot() { $host = request()->getHost(); if (str_contains($host, '.' . env('APP_DOMAIN', 'localhost'))) { \Livewire\Livewire::setAssetUrl('//' . $host); } }
- 配置会话跨子域名共享(可选)
如果需要同根域名下多子域名会话互通,修改config/session.php中的domain配置:
'domain' => '.' . env('APP_DOMAIN', 'localhost'),
内容的提问来源于stack exchange,提问作者Suhail Kawsara
相关产品推荐
相关产品推荐

