Laravel路由域名配置:排除base.domain访问特定路由组
Laravel路由排除特定域名解决方案
方法一:路由参数正则约束(推荐)
直接在路由组的参数约束里排除base子域名,让路由匹配阶段就过滤掉base.domain:
Route::group([ 'domain' => '{domain}.{ltd}', 'where' => ['domain' => '^(?!base$).+'] // 正则负前瞻,匹配非base的domain ], function() { // 你的路由定义 });
正则^(?!base$).+的作用是匹配任何不等于base的字符串,确保只有子域名非base时,才会进入该路由组。
方法二:优先定义特定域名路由
利用Laravel路由先定义先匹配的规则,先单独注册base.domain的专属路由组,再定义通用域名路由组:
// 先定义base.domain的专属路由 Route::group(['domain' => 'base.domain'], function() { // 放置base域名对应的路由 }); // 再定义其他域名的通用路由组 Route::group(['domain' => '{domain}.{ltd}'], function() { // 你的通用路由定义 });
当访问base.domain时,会优先匹配第一个路由组,不会触发后续的通用路由组,直接实现需求。
方法三:中间件过滤(适合复杂场景)
如果需要更灵活的域名判断逻辑,可通过中间件实现:
- 创建中间件:
php artisan make:middleware ExcludeBaseDomain
- 在
app/Http/Middleware/ExcludeBaseDomain.php中编写过滤逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class ExcludeBaseDomain { public function handle(Request $request, Closure $next) { if ($request->getHost() === 'base.domain') { // 拒绝访问该路由组,可根据需求改为重定向或其他处理 throw new NotFoundHttpException(); } return $next($request); } }
- 在
app/Http/Kernel.php中注册中间件:
protected $routeMiddleware = [ // 其他中间件 'exclude.base' => \App\Http\Middleware\ExcludeBaseDomain::class, ];
- 在路由组中绑定该中间件:
Route::group([ 'domain' => '{domain}.{ltd}', 'middleware' => 'exclude.base' ], function() { // 你的路由定义 });
内容的提问来源于stack exchange,提问作者Evg
相关产品推荐
相关产品推荐

