我正在尝试使经过身份验证的子域路由适用于某些特定的可变子域:
app.example.com
staging.app.example.com
testing.app.example.com
这些应由auth中间件保护。它们基本上都引用
app.example.com
,但用于不同的环境。到达这些域的所有内容都应进入访客路线:
example.com
staging.example.com
testing.example.com
到目前为止,这是我尝试过的...
创建了此中间件,以防止subdomain参数弄乱其他路由,并允许成功的身份验证重定向到
app.example.com
:class Subdomain
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$route = $request->route();
$subdomain = $route->parameter('subdomain');
if (!empty($subdomain) && preg_match('/^(staging|testing)\.(app.\)?/', $subdomain, $m)) {
\Session::put('subdomain', $m[1]);
}
$route->forgetParameter('subdomain');
return $next($request);
}
}
将此添加到Kernel.php:
protected $routeMiddleware = [
'subdomain' => \App\Http\Middleware\Subdomain::class,
];
route.php的内容:
Route::group(['domain' => '{subdomain?}example.com', 'middleware' => 'subdomain'], function () {
// Backend routes
Route::group(['middleware' => 'auth'], function () {
Route::get('/', ['as' => 'dashboard', 'uses' => 'Controller@dashboard']);
// ...various other backend routes...
});
// Frontend routes
Route::auth();
Route::get('/', function () {
return view('frontend');
});
});
当我访问任何路由时,都可以跟踪到
subdomain
中间件没有东西……它只是路由到404页面。我如何在Laravel 5.2中进行这项工作?
最佳答案
由于设置的目的是允许使用可选的环境前缀处理某些子域组,因此我以以下方式进行处理。
我删除了Subdomain
类,因为它是不必要的。
我将其添加到.env
文件中,以便每个环境都可以拥有自己的域,因此本地开发服务器仍然可以独立于暂存和生产服务器运行:
APP_DOMAIN=example.dev
在生产和分阶段上,只需:
APP_DOMAIN=example.com
在
config/app.php
中,我添加了:'domain' => env('APP_DOMAIN', null),
我将这些方法添加到
\App\Http\Controllers\Controller
:public static function getAppDomain()
{
return (!in_array(\App::environment(), ['local', 'production']) ? \App::environment() . '.' : '') . 'app.' . config('app.domain');
}
public static function getAppUrl($path = '', $secure = false)
{
return ($secure ? 'https' : 'http') . '://' . static::getAppDomain() . ($path ? '/' . $path : '');
}
在
Auth\AuthController.php
中,我添加了它来处理从app.example.com
到example.com
的重定向,即使前缀为staging
或testing
:public function redirectPath()
{
if (\Auth::check()) {
return redirect()->intended(static::getAppUrl())->getTargetUrl();
} else {
return $this->redirectTo;
}
}
route.php的新内容:
// Backend routes
Route::group(['domain' => Controller::getAppDomain(), 'middleware' => 'auth'], function () {
Route::get('/', ['as' => 'dashboard', 'uses' => 'Controller@dashboard']);
// ...various other backend routes...
});
// Frontend routes
Route::auth();
Route::get('/', function () {
return view('frontend');
});
希望有人尝试类似的方法会有所帮助!
关于laravel - Laravel认证的动态子域路由,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39605467/