我有一个应用程序在侦听三种类型的子域:
自定义子域从通配符子域进入,并由Laravel中间件进行管理,该中间件检查数据库的有效性,如果有未知子域请求进入,则路由到 www.website.com 。
否则,该应用在这里和那里在 *。app.website.com 上的行为会有所不同,但与主要应用基本相同。
backend.website.com 上的请求应使用命名空间。
此设置大部分都可以正常工作。
可以通过 backend.website.com 子域访问主应用程序的路由。我希望管理员路由仅考虑其组内的路由。
我试图用通配符按域分隔路由组,但是这会将通配符作为第一个参数传递给所有控制器操作,这是不可取的。我完全不需要通配符,因为它将由中间件检查和处理。
Route::domain('backend.website.com')->group(function () {
Route::get('/', function () {
…
});
});
$appRoutes = function() {
// this should not be hit by backend.website.com
Route::get('/', function () {
…
})->name('home');
…
};
Route::domain('www.website.com')->group($appRoutes);
// would probably work but passes $account to all
// controller actions as first parameter which is undesirable
Route::domain('{account}.app.website.com')->group($appRoutes);
我希望足够清楚,感谢您的帮助。
答案 0 :(得分:0)
万岁,我想我在问了几分钟后才找到答案。如果这是胡扯,请纠正我。
Route::domain(config('app.admin_url'))->group(function () {
Route::get('/', function () {
…
});
});
$appRoutes = function() {
Route::get('/', function () {
…
})->name('home');
…
};
// the middleware will redirect all requests from subdomains it does not know
// to the main application anyway, so trying to request main application routes
// via backend.website.com will be redirected – yes!
Route::middleware(['\App\Http\Middleware\CheckSiteDomain'])->group($appRoutes);
public function handle($request, Closure $next)
{
$url = url('');
$app_url_regex = preg_quote(config('app.url'), '/');
if (!preg_match("/^$app_url_regex/i", $url)) {
// if current subdomain does not equal main application domain
// try to find a matching "site" in the database and
// redirect if none is found
$site = Site::byUrl($url, true);
if (!$site)
return redirect(config('app.url'));
}
return $next($request);
}
还是谢谢!抱歉,在询问之前,我总是经过很长时间的努力-下次可能还要更长的时间。 ;-)