子域名路由404主因是注册顺序颠倒,必须将Route::domain()组置于所有根域名路由之前,且组内需定义匹配请求路径的路由(如Route::get('/')),同时确认DNS、Web服务器配置及中间件未干扰子域名识别。

不是中间件顺序问题,也不是通配符写错——子域名路由 404 的主因是注册顺序颠倒。
子域名路由必须优先注册
Laravel 路由系统按定义顺序逐条匹配,且一旦命中就停止查找。子域名路由(如 Route::domain('{slug}.domain.pl')->group(...))本质是更宽泛的匹配模式,如果放在根域名路由之后,请求 company.domain.pl/ 就会先被根域名下的 Route::get('/', ...) 拦截,而该路由不处理子域名上下文,最终返回 404。
- ✅ 正确做法:子域名路由组必须写在 所有根域名路由之前
- ❌ 错误写法:把
Route::domain(...)放在Route::get('/', ...)后面 - 注意:{slug} 是合法通配符,无需改写;问题不在语法,而在加载时机
确保子域名路由组内有实际匹配规则
仅声明 Route::domain('{slug}.domain.pl')->group(...) 不够,组内必须包含能响应当前请求路径的路由。比如访问 company.domain.pl/,但组内只定义了 Route::get('dashboard', ...),那首页仍会 404。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 检查组内是否包含
Route::get('/', ...)或对应路径 - 确认控制器方法存在且未抛出异常(例如模型查询失败未 fallback)
- 可临时加一个闭包路由测试:
Route::get('/', fn() => 'subdomain ok');
验证 DNS 和服务器配置是否到位
路由定义正确,但始终 404,大概率是请求根本没进 Laravel:
- 确认 DNS 已将
*.domain.pl泛解析到服务器 IP - Nginx/Apache 配置中 server_name 是否支持通配符或明确列出子域名
- 本地开发用
127.0.0.1 company.domain.pl测试前,记得刷新 hosts 缓存
别让中间件意外拦截子域名请求
虽然中间件顺序不是 404 主因,但某些中间件可能干扰子域名识别:
- 确保
SubstituteBindings::class等绑定中间件没有对 {slug} 做强制模型查找并失败 - 避免在中间件里调用
request()->route()时假设路由已完全解析 - 若用了自定义域名校验中间件,确认它允许
{slug}.domain.pl格式










