Laravel,不同子域上的相同路径使用了错误的控制器

Laravel, same path on a different subdomain uses wrong controller

问题

如何设置 Laravel 路由以便:

我在做什么

我有一个 Laravel 5.7 应用程序,它有一个典型的登录页面,比如 mystite.com/login

我想为此应用程序设置一个子域,例如 somecompany.mysite.com,它将拥有自己的身份验证。

我希望 somecompany 用户在 somecompany.mysite.com/login

登录

我试过的

主站登录路由定义

Route::group(['namespace' => 'App\Http\Controllers\Auth', 'middleware' => ['web']], function () {
    Route::get('login',   'LoginController@showLoginForm')->name('login');
});

subsomain 登录的路由定义

Route::domain('somecompany.mysite.com')->group(function ($router) {
    $router->group(['namespace' => 'App\Http\Controllers\Tenant\Auth', 'middleware' => ['web']], function($router) {
        $router->get('login',   'TenantLoginController@showLoginForm')->name('somecompany.login');
    });
});

发生了什么

我可以导航到 somecompany.mysite.com/login 并且 URL 栏显示 somecompany.mysite.com/login 但是当我这样做时,请求实际上被路由到 'LoginController@showLoginForm' 控制器而不是预期的 'TenantLoginController@showLoginForm' 并且显示了典型的登录表单,而不是子域的登录表单。

如果我将路径更改为 $router->get('tenant-login' 并导航至 somecompany.mysite.com/tenant-login,则会显示子域登录表单,而 somecompany.mysite.com/login 会显示主登录表单。

由于您没有在第一个路由中指定域(由 LoginController 处理),它应该对 somecompany.mysite.com 子域也有效。

为了解决这个问题,我建议尝试为第一条路线添加更多的特异性,将其用 Route::domain('mysite.com') 括起来。

Laravel 路由器总是采用第一个匹配的路由,第一个匹配到最后就好了。