Laravel,不同子域上的相同路径使用了错误的控制器
Laravel, same path on a different subdomain uses wrong controller
问题
如何设置 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');
});
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 路由器总是采用第一个匹配的路由,第一个匹配到最后就好了。
问题
如何设置 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');
});
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 路由器总是采用第一个匹配的路由,第一个匹配到最后就好了。