gpt4 book ai didi

Laravel 经过身份验证的动态子域路由

转载 作者:行者123 更新时间:2023-12-02 19:43:20 25 4
gpt4 key购买 nike

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

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

当我访问任何路由时,我可以跟踪到没有任何内容到达子域中间件...它只是路由到 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中,我添加了这个来处理从example.comapp.example.com的重定向,即使有前缀与登台测试:

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

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

关于Laravel 经过身份验证的动态子域路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39605467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com