Laravel主域路由适用于子域

时间:2018-02-12 11:00:53

标签: php laravel

当我打开test.example.com/main时,我预计会出现404错误,因为此路由未在子域路由中定义。但主域路由适用于子域。因此路由Route::get('/main' ...运行并且看起来有效,但它必须无效。

我的routes/web.php

Route::domain('test.example.com') -> group(function () {
    Route::get('/sub', function(){
        return view('sub.index');
    });
});

Route::get('/main', function(){
    return view('main.index');
})

4 个答案:

答案 0 :(得分:5)

我对laravel没有多少经验,但我认为问题是main路由开始设置为匹配所有域,而/sub路由在子域组内,所以我猜你有两个选择

1 - 将每个域路由组合在一起:

<?php  

Route::domain('test.example.org') -> group(function () {
    Route::get('/sub', function(){
        return view('sub.index');
    });
});

Route::domain('www.example.org') -> group(function () {
    Route::get('/main', function(){
        return view('main.index');
    });
});

2 - 创建一个中间件domain来检查主机并返回404页面,如果主机不匹配(我猜第一个选项会更好)

<?php

Route::get('/main', function(){
    return view('main.index');
})->middleware('domain');

答案 1 :(得分:1)

正如#saif第二个选项所建议的那样,我也在我的一个项目中创建了中间件

步骤1:

php artisan make:middleware Domain

它将在app/Http/Middlewares中创建名称为Domain.php的中间件文件

步骤2:

<?php

namespace App\Http\Middleware;

use Closure;

class Domain
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->getHost() != config('app.domain'))
            abort(404);

        return $next($request);
    }
}

这里config('app.domain')是我的主要域名,例如example.com

步骤3:

在位于app/Http/Kernel.php 的Http Kernel文件中添加中间件 找到 protected $routeMiddleware数组列表,然后添加到列表顶部 看起来像这样

protected $routeMiddleware = [
        'domain' => \App\Http\Middleware\Domain::class,
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

现在您可以像这样在web.php中使用中间件

Route::middleware(['domain'])->group(function () { 
    Route::get('/', 'PageController@home_page')->name('home');
});

Route::get('/', 'PageController@home_page')->name('home')->middleware('domain');

例如,您的web.php具有类似的内容

Route::domain('app.'.config('app.domain'))->group(function () {
    Route::get('/dashboard', function () {
        dd('Dashboard');
    });
});

Route::middleware(['domain'])->group(function () {
    
    Route::get('/', 'PageController@home_page')->name('home');

});

http://example.com上将提供主页,在http://app.example.com上将提供404

答案 2 :(得分:0)

管理此问题的正确位置是路线服务提供商。

在 RouteServiceProvider 中,您可以添加 ->domain('example.com') 并使用此映射所有 web.php 路由,而无需触及文件。

相反,可以为您的子域创建一个专用的 web.php 文件,例如在 routes/test/web.php 中。 然后你也可以只为与 ->domain('test.example.com') 相关的子域映射这些路由,并用 ->group(base_path('routes/test/web.php'))

替换路径

我回答得有点晚,但我现在不得不面对这种情况,我找到了这个话题:-)

答案 3 :(得分:0)

用主域包裹主路由:

Route::domain('example.com') -> group(function () {
    Route::get('/main', function(){
        return view('main.index');
    });
});

这花了我很多时间才弄明白,我几乎退出了几次。正如人们所说,还有其他解决方案:中间件或 RouteServiceProvider 编辑。