【问题标题】:Laravel authenticated dynamic subdomain routingLaravel 认证的动态子域路由
【发布时间】:2017-01-29 01:11:30
【问题描述】:

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

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

当我访问任何路由时,我可以追踪到 subdomain 中间件没有任何东西...它只是路由到 404 页面。

如何在 Laravel 5.2 中进行这项工作?

【问题讨论】:

    标签: laravel laravel-5.2 laravel-routing


    【解决方案1】:

    由于我的设置目标是允许处理具有可选环境前缀的某些子域组,因此我按以下方式处理它。

    我删除了 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 内,我添加了这个来处理从example.comapp.example.com 的重定向,即使前缀为stagingtesting

    public function redirectPath()
    {
        if (\Auth::check()) {
            return redirect()->intended(static::getAppUrl())->getTargetUrl();
        } else {
            return $this->redirectTo;
        }
    }
    

    routes.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');
    });
    

    希望如果有人尝试类似,这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 2019-12-23
      • 1970-01-01
      • 2014-10-03
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多