Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel认证动态子域路由_Laravel_Laravel 5.2_Laravel Routing - Fatal编程技术网

Laravel认证动态子域路由

Laravel认证动态子域路由,laravel,laravel-5.2,laravel-routing,Laravel,Laravel 5.2,Laravel Routing,我正在尝试使经过身份验证的子域路由适用于某些特定的变量子域: app.example.com staging.app.example.com testing.app.example.com 这些应该由auth中间件进行保护。它们基本上都引用了app.example.com,但适用于不同的环境 访问这些域的所有内容都应转到来宾路由: example.com staging.example.com testing.example.com 这就是我到目前为止所尝试的 创建此中间件是为了防止子域参数

我正在尝试使经过身份验证的子域路由适用于某些特定的变量子域:

app.example.com
staging.app.example.com
testing.app.example.com
这些应该由auth中间件进行保护。它们基本上都引用了app.example.com,但适用于不同的环境

访问这些域的所有内容都应转到来宾路由:

example.com
staging.example.com
testing.example.com
这就是我到目前为止所尝试的

创建此中间件是为了防止子域参数扰乱其他路由,并允许成功的身份验证重定向到
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,
];
routes.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');
    });
});
// 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');
});
当我访问任何路由时,我都可以跟踪到没有任何东西击中
子域
中间件…它只是路由到404页面


如何在Laravel 5.2中实现这一点?

由于我的设置的目标是允许使用可选的环境前缀处理某些子域组,因此我采用以下方式进行处理

我放弃了
子域
类,因为它是不必要的

我将其添加到
.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
中,我添加了此选项以处理从
example.com
app.example.com
的重定向,即使前缀为
staging
testing

public function redirectPath()
{
    if (\Auth::check()) {
        return redirect()->intended(static::getAppUrl())->getTargetUrl();
    } else {
        return $this->redirectTo;
    }
}
routes.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');
    });
});
// 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');
});
希望这有助于如果有人尝试类似的