路由:如何将路由应用于除一个域之外的所有域

时间:2019-01-29 08:53:41

标签: laravel-routing laravel-5.7

我有一个应用程序在侦听三种类型的子域:

  1. 主要应用程序: www.website.com
  2. 通过与主应用程序相同的逻辑处理的自定义子域: *。app.website.com
  3. 管理面板: backend.website.com

设置

自定义子域从通配符子域进入,并由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);

我希望足够清楚,感谢您的帮助。

1 个答案:

答案 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);

CheckSiteDomain中间件

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);
}

还是谢谢!抱歉,在询问之前,我总是经过很长时间的努力-下次可能还要更长的时间。 ;-)