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

时间:2017-07-31 07:51:49

标签: routing laravel-5.2 subdomain

我有一个使用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应用程序的用户,依此类推......
  4. 我的早期方法通过解析完整的请求URL然后相应地路由用户,有效。我想要的是一种更健壮和更优雅的方式(所以尝试使用laravel域路由)。但是,通过上面显示的示例代码,子域名,我总是看到Sub1 Site',无论子域名是什么。

2 个答案:

答案 0 :(得分:3)

  

我尝试没有通过,在这种情况下,所有网址仅打印" sub1"

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

{sub1}可能是真的,所以当你进入时,例如,  " anythingreally.mydomain.com/login"它仍然会被捕获,并将子域传递给变量$ sub1。

答案 1 :(得分:2)

我认为对它的工作意义有一点误解。如果您在{}中传递子域,那么您基本上就是说它是一个变量子域,这意味着'{sub1}.'.env('APP_DOMAIN')'{sub2}.'.env('APP_DOMAIN')基本上是相同的,但子域的变量名称不同:< / p>

示例:

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

请注意,删除{}这意味着第一个组将匹配文字 sub1。而不是*.<rest of domain>