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

问题描述 投票:1回答:1

如何设置Laravel路由以便:

  • 导航到mysite.com/login使用LoginController
  • 导航到somecompany.mysite.com/login使用TenantLoginController

我在做什么

我有一个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');
});

子域登录的路径定义

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会显示主登录表单。

php laravel laravel-5 url-routing
1个回答
2
投票

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

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

Laravel路由器始终采用第一个匹配路由,并且第一个匹配路由最后匹配。

© www.soinside.com 2019 - 2024. All rights reserved.