当我打开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');
})
答案 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 编辑。