
在 laravel 中,无需为每个子域名部署独立应用,可通过 `route::domain()` 方法在单一 laravel 实例中按子域名分组定义路由,实现 shop.mycompany.com 与 comment.mycompany.com 等多子域名共用同一套代码库。
Laravel 原生支持基于子域名的路由分组,这使得你完全可以在同一个 Laravel 应用中优雅地服务多个子域名(如 shop.mycompany.com 和 comment.mycompany.com),而无需重复部署、维护多套应用。关键在于利用 Route::domain() 方法对路由进行作用域隔离。
✅ 正确做法如下:
在 routes/web.php(或 routes/api.php)中按需定义子域名路由组:
// 处理 shop.mycompany.com 及其变体(如 us.shop.mycompany.com)
Route::domain('{sub}.mycompany.com')->group(function () {
Route::get('/item', [ShopController::class, 'showItem'])->where('sub', 'shop|us|eu'); // 限制合法子域名
});
// 专用于 comment.mycompany.com 的路由
Route::domain('comment.mycompany.com')->group(function () {
Route::get('/customer', [CommentController::class, 'showForm']);
Route::post('/customer/{id}', [CommentController::class, 'store']);
});⚠️ 注意事项:
- DNS 与 Web 服务器配置必须先行:确保 shop.mycompany.com 和 comment.mycompany.com 均已解析到你的服务器 IP,并在 Nginx/Apache 中配置为指向同一 Laravel 项目根目录(即 public/)。例如 Nginx 需使用 server_name *.mycompany.com; 或显式列出所有子域名。
- {sub} 参数需配合 where() 约束:避免通配符匹配意外子域名(如 hacker.mycompany.com),提升安全性。
- 中间件与配置可差异化:每个 domain 组内可单独应用中间件(如 auth:api)、命名空间或前缀,实现逻辑隔离。
- 环境与缓存:修改路由后请运行 php artisan route:clear,生产环境建议配合 php artisan config:cache 确保一致性。
? 进阶提示:若未来需共享用户会话或跨子域名认证,可配置 SESSION_DOMAIN=.mycompany.com(注意开头的点号),使 Cookie 在所有子域名下有效;同时确保 APP_URL 设置为 https://mycompany.com(主域)以保障 URL 生成正确。
综上,你当前的 shop.mycompany.com 应用完全可扩展支持 comment.mycompany.com —— 这不仅是可行的,更是 Laravel 推荐的轻量、可维护的多租户/多站点实践方式。











