Laravel 5.2 使用路由器功能的子域路由
Laravel 5.2 subdomain routing by using the Router function
我有一个使用 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;
});
});
更新
有关该行为的更多信息:
- 当用户访问www.mydomain.com/login时,
应该显示管理员。
- 当用户访问sub1.mydomain.com/login时,
应显示 sub1 应用程序用户的登录页面。
- 当用户访问sub2.mydomain.com/login时,
应显示 sub2 应用程序的用户,依此类推...
我之前通过解析完整请求 url 然后相应地路由用户的方法有效。我想要的是一种更健壮和优雅的方式(因此尝试使用 laravel 域路由)。但是对于我上面显示的示例代码,对于子域,我总是看到 'Sub1 Site',而不管传递的子域是什么。
I tried without passing and in that case, all URLs printed only "sub1"
当然,因为第一个路由组捕获了所有请求。
您可以完全删除第二个路由组,并添加逻辑(您不应该在路由配置中这样做)来处理子域。
{sub1} 可以是任何东西,所以当你输入时,例如,
“ anythingreally.mydomain.com/login ”它仍然会被捕获,并将子域传递给变量 $sub1。
我认为对于它的工作原理存在一些误解。如果您在 {}
中传递子域,那么您基本上是在说它是一个可变子域,这意味着 '{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>
我有一个使用 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;
});
});
更新
有关该行为的更多信息:
- 当用户访问www.mydomain.com/login时, 应该显示管理员。
- 当用户访问sub1.mydomain.com/login时, 应显示 sub1 应用程序用户的登录页面。
- 当用户访问sub2.mydomain.com/login时, 应显示 sub2 应用程序的用户,依此类推...
我之前通过解析完整请求 url 然后相应地路由用户的方法有效。我想要的是一种更健壮和优雅的方式(因此尝试使用 laravel 域路由)。但是对于我上面显示的示例代码,对于子域,我总是看到 'Sub1 Site',而不管传递的子域是什么。
I tried without passing and in that case, all URLs printed only "sub1"
当然,因为第一个路由组捕获了所有请求。 您可以完全删除第二个路由组,并添加逻辑(您不应该在路由配置中这样做)来处理子域。
{sub1} 可以是任何东西,所以当你输入时,例如, “ anythingreally.mydomain.com/login ”它仍然会被捕获,并将子域传递给变量 $sub1。
我认为对于它的工作原理存在一些误解。如果您在 {}
中传递子域,那么您基本上是在说它是一个可变子域,这意味着 '{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>