Route::domain() 用于在 routes/web.php 中按域名匹配路由组,仅接受纯域名格式(如 admin.example.com 或 {sub}.example.com),匹配成功才执行内部路由,否则返回 404。

如何用 Route::domain() 区分多域名路由
直接在 routes/web.php 里用 Route::domain() 套一层,就能让不同域名走不同路由组。它不是“绑定模块”的魔法开关,而是路由层的域名匹配规则——匹配成功才进里面定义的路由,否则 404。
常见错误是把域名写成 https://admin.example.com(带协议)或漏掉通配符导致子域名不生效。
- 域名参数只接受纯域名格式,如
admin.example.com或{sub}.example.com - 通配符变量需在路由闭包或控制器中显式接收,例如
function ($sub) { ... } - 如果用了 HTTPS 反向代理,确保
APP_URL和TrustedProxy配置正确,否则Request::getHost()可能读错 - 多个
Route::domain()组之间互不影响,但顺序无关——Laravel 按请求 Host 字段精确/通配匹配,不回溯
Laravel 多域名下如何隔离模块逻辑
域名路由只是入口,真正隔离模块得靠服务提供者、配置加载和命名空间控制。别指望一个 Route::domain() 自动帮你切数据库连接或中间件。
典型场景:用户站点 www.site.com 和后台 admin.site.com 共享模型但权限、布局、中间件完全不同。
- 在
App\Providers\RouteServiceProvider的boot()中,根据request()->getHost()动态加载不同路由文件,比如routes/admin.php和routes/web.php - 用中间件判断当前域名,动态绑定不同的
Auth::guard()或注入不同的 Repository 实现 - 避免在
config/app.php里硬编码域名相关配置;改用config('app.domains.admin')并在config/app.php中按环境合并 - 视图路径可动态切换:
view()->addLocation(resource_path('views/admin')),但注意view:clear会清掉所有缓存
为什么 URL::to() 和重定向总跳错域名
因为 Laravel 默认用 APP_URL 构造绝对 URL,而多域名下这个值只能是一个。不干预的话,所有 URL::to()、redirect()->route() 都会指向 APP_URL 定义的域名,哪怕请求来自另一个域名。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
这不是 bug,是设计使然——框架没义务猜你想要哪个域名。
- 最稳的方式:重写
UrlGenerator,在Illuminate\Routing\UrlGenerator的full()方法里根据当前请求 Host 动态拼接 scheme + host - 简单项目可用中间件全局替换:
request()->server->set('HTTP_HOST', $expectedHost),但会影响日志和调试工具 -
RedirectResponse不支持自动换域名,必须显式调用redirect('https://admin.example.com/dashboard')或用to()拼完整 URL - 生成邮件链接时尤其危险——队列任务里没有 request 上下文,
URL::to()必定失效,必须传入完整域名参数
部署时 Nginx/Apache 怎么配合 Laravel 多域名
Web 服务器必须把所有相关域名都指向同一个 Laravel 入口(public/index.php),否则 Route::domain() 根本收不到请求。
常见错误是为每个域名单独配一个 Laravel 部署目录,或者 Nginx 里用 root 指向不同 public,结果 PHP-FPM 收到的 $_SERVER['HTTP_HOST'] 是对的,但 Laravel 还没启动就被 Web 服务器拦截了。
- Nginx 示例:多个
server块共用同一份root /var/www/laravel/public;,仅靠server_name admin.example.com www.example.com;区分 - Apache 要启用
mod_vhost_alias或写多个<virtualhost></virtualhost>,但 DocumentRoot 必须一致 - 本地开发用
php artisan serve --host=0.0.0.0 --port=8000不支持多域名,必须用 Valet、Docker 或配 hosts + Nginx - Cloudflare 等 CDN 后面要注意是否开启“伪装 IP”,否则
request()->ip()和 Host 判断可能失准
域名路由本身很简单,难的是后续链路——从请求进来那一刻起,每一个依赖 Host 的环节(URL 生成、缓存键、日志标记、队列任务上下文)都得重新审视。很多人卡在第 3 步,却回头去改第 1 步的路由写法。

















