Laravel 12 中子域名路由必须用 Route::domain() 在 routes/web.php 中按顺序定义,基于 Host 头匹配,支持泛域名 {sub}.example.com 和 where 约束,须置于根域名路由之前,并配合 DNS 泛解析与 SESSION_DOMAIN=.example.com 配置。

在 Laravel 12 中,用 Route::domain() 给子域名单独配置路由组,核心是**按 Host 头精准匹配 + 路由分组隔离 + 正确注册时机**。它不是加前缀,而是基于 HTTP 请求的域名字段做路由分支,必须写在 routes/web.php(或 api.php)中,且顺序很关键。
✅ 必须写在 routes/web.php 里,不能放错位置
Laravel 12 的路由加载机制没变:所有 Route::domain() 必须定义在 routes/web.php 文件内(默认已由 RouteServiceProvider 自动加载)。不要试图在中间件、控制器或服务提供者里动态注册——那不会生效。
- 确保你修改的是
routes/web.php,不是app/Providers/RouteServiceProvider.php - 不要用
Route::prefix('shop.example.com')替代,这完全无效,Laravel 不会解析 prefix 为域名 - 泛域名写法如
{sub}.example.com中的{sub}是路由参数,会在控制器方法或闭包中自动注入
✅ 按子域名分组写法示例
每个 Route::domain() 定义一个独立作用域,互不干扰:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
// 匹配 shop.example.com 及其子路径
Route::domain('shop.example.com')->group(function () {
Route::get('/', [ShopController::class, 'index'])->name('shop.home');
Route::get('/products', [ShopController::class, 'list']);
});
// 匹配 api.example.com
Route::domain('api.example.com')->group(function () {
Route::get('/v1/status', fn() => response()->json(['ok' => true]));
Route::post('/v1/orders', [Api\OrderController::class, 'store']);
});
// 泛匹配:匹配任意一级子域名,如 us.example.com、jp.example.com
Route::domain('{locale}.example.com')->group(function () {
Route::get('/', function (string $locale) {
return view('home', ['locale' => $locale]);
})->where('locale', '[a-z]{2}');
});
-
where()用于约束参数格式,避免恶意输入(比如只允许两位小写字母) - 泛匹配路由建议放在具体域名之后、根域名之前,避免误捕获
- 每个 group 内可自由使用
middleware()、prefix()、name()等
✅ 注意路由匹配顺序:子域名优先于根域名
Laravel 按代码从上到下匹配。如果把根域名路由(比如 Route::get('/', ...))写在子域名路由前面,访问 shop.example.com/ 时可能被根路由“兜底”捕获,导致子域名失效。
- 正确顺序:先写所有
Route::domain(...),最后再写无 domain 约束的默认路由 - 例如,把主站
example.com的路由放在文件末尾 - 本地测试时,需在
/etc/hosts添加对应条目:127.0.0.1 shop.example.com api.example.com
✅ Web 服务器要支持泛解析或明确绑定
Laravel 只负责路由匹配,请求得先到达应用。Nginx 或 Apache 必须把多个子域名指向同一个 Laravel public 目录:
- Nginx 示例:
server_name *.example.com example.com; - Apache 示例:
ServerAlias *.example.com - 线上部署需 DNS 设置泛解析(
*.example.com → A 记录),否则请求根本进不到 Laravel - Cookie 共享注意:
SESSION_DOMAIN=.example.com才能让登录态跨子域名有效










