Laravel 5.2 使用 Router 功能进行子域路由

问题描述 投票:0回答:2

我有一个使用 Laravel 5.2 构建的应用程序。该应用程序有 3-4 种不同类型的完全不同的用例(迷你应用程序,如果可以的话)。因此,我在主域上托管主站点和管理员路由。对于每个迷你应用程序,我创建了一个子域,并且所有迷你应用程序路由都有自己的子域。我映射子域的方式是:

$sub = str_replace('http://', '', strstr(Request::fullUrl(), '.', true));

if ( $sub == env('APP_SUB1') ) { 

 //Subdomain1 routes

} else if ( $sub == env('APP_SUB2') ) { 

//Subdomain2 routes

}

现在,我希望能够使用 Laravel 子域内置的子域路由,我尝试过:

Route::group(['domain' => env('APP_DOMAIN')], function () {
    Route::get('/', function () {
        echo 'Main Site';
        die;
    });
});

Route::group(['domain' => '{sub1}.'.env('APP_DOMAIN')], function () {
    Route::get('/', function ($sub1) {
        echo 'Sub1 Site';
        die;
    });
});

Route::group(['domain' => '{sub2}.'.env('APP_DOMAIN')], function () {
    Route::get('/', function ($sub2) {
        echo 'Sub2';
        die;
    });
});

更新

有关行为的更多信息:

  1. 当用户访问www.mydomain.com/login时,登录页面 应该显示管理员。
  2. 当用户访问 sub1.mydomain.com/login 时, 应显示 sub1 应用程序用户的登录页面。
  3. 当用户访问 sub2.mydomain.com/login 时,登录页面为 应显示 sub2 应用程序的用户,依此类推...

我之前的方法是解析完整的请求 URL,然后相应地路由用户,这是有效的。我想要的是一种更健壮和优雅的方式(因此尝试使用 laravel 域路由)。但通过我上面显示的示例代码,对于子域,我总是看到“Sub1 Site”,无论传递的子域是什么。

php laravel-5 routes subdomain
2个回答
3
投票

我尝试了但没有通过,在这种情况下,所有 URL 只打印“sub1”

当然,因为第一个路由组捕获了所有请求。 您可以完全删除第二个路由组,并添加逻辑(您不应该在路由配置中执行此操作)来处理子域。

{sub1} 可以是任何东西,所以当你输入时,例如, “ everythingreally.mydomain.com/login ”它仍然会被捕获,并将子域传递给变量 $sub1。


2
投票

我认为对其工作原理存在一些误解。如果您在

{}
中传递子域,那么您基本上是说它是一个变量子域,这意味着
'{sub1}.'.env('APP_DOMAIN')
'{sub2}.'.env('APP_DOMAIN')
本质上是相同的东西,但子域的变量名称不同:

示例:

Route::group(['domain' => '{sub1}.'.env('APP_DOMAIN')], function () {
    Route::get('/', function ($sub1) {
       echo $sub1." Site";
       //Prints sub1 Site when visiting sub1 and sub2 site when visiting sub2
       die;
   });
}]); 

(我假设)你想要的是:

Route::group(['domain' => 'sub1.'.env('APP_DOMAIN')], function () {
    Route::get('/', function () {
       echo "Sub1 Site";
       die;
   });
}]); 
Route::group(['domain' => 'sub2.'.env('APP_DOMAIN')], function () {
    Route::get('/', function () {
       echo "Sub2 Site";
       die;
   });
}]); 

注意删除了

{}
,这意味着第一组将与 literal sub1 匹配。而不是
*.<rest of domain>

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