Маршрутизация: как применять маршруты ко всем доменам, кроме одного - PullRequest
0 голосов
/ 29 января 2019

У меня есть приложение, прослушивающее три типа поддоменов:

  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 голосов
/ 29 января 2019

Ура, я думаю, что нашел ответ только через несколько минут после того, как спросил.Пожалуйста, поправьте меня, если это чушь.

Маршруты

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 Middleware

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

Спасибо в любом случае!Извините, я всегда долго борюсь, прежде чем спрашивать - возможно, еще дольше в следующий раз.; -)

...