要让 Laravel 12 后台仅允许固定域名访问,核心是服务端强制校验 Host 头:方法一用中间件校验 $request->getHost() 并 abort(403);方法二用 Route::domain() 限定子域名路由;方法三在 Nginx 层通过 $host 判断并 return 403。Referer 和 CORS 不适用,因前者可伪造、后者不控制直接访问。

要让 Laravel 12 后台(如 /admin 路由或 admin.example.com 子域名)**只允许某个固定域名访问**,核心思路是:在请求进入业务逻辑前,通过中间件或路由约束拦截非授权来源。这不是单纯靠前端跳转或 JS 判断,而是服务端强制校验 Host 请求头或 Referer(不推荐 Referer,易伪造),确保只有指定域名能触发后台逻辑。
方法一:用中间件校验 Host 头(推荐)
这是最直接、可靠的方式,适用于所有部署环境(Nginx/Apache/本地开发)。
- 运行命令生成中间件:
php artisan make:middleware AllowAdminDomain - 编辑
app/Http/Middleware/AllowAdminDomain.php,在handle()方法中写入:
admin.yourdomain.com 为你实际允许的域名)
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
if ($request->getHost() !== 'admin.yourdomain.com') {<br> abort(403, 'Access denied: admin domain not allowed.');<br>}
- 将该中间件注册到路由组中,例如在
routes/web.php中:
Route::middleware(['auth', 'allow.admin.domain'])<br> ->prefix('admin')<br> ->group(function () {<br> Route::get('/dashboard', [AdminController::class, 'index']);<br> });
- 别忘了在
app/Http/Kernel.php的$routeMiddleware数组里添加别名:'allow.admin.domain' => \App\Http\Middleware\AllowAdminDomain::class,
方法二:子域名路由 + domain() 约束(仅限二级域名后台)
如果你的后台地址本身就是子域名(如 admin.example.com),Laravel 原生支持按域名分组路由,天然隔离。
- 确保 Web 服务器(Nginx/Apache)已把
admin.example.com指向 Laravel 入口(常见错误:请求根本没进 Laravel) - 在
routes/web.php中使用Route::domain()显式限定:
Route::domain('admin.example.com')->middleware('auth')->group(function () {<br> Route::get('/', [AdminController::class, 'index'])->name('admin.home');<br> Route::get('/users', [UserController::class, 'index']);<br>});
- 此时,访问
http://example.com/admin或http://test.example.com都不会命中这组路由 —— Laravel 根本不处理,自动 fallback 到其他路由或 404
方法三:Nginx 层硬性限制(生产环境强推)
在 Web 服务器层面拦截,比 PHP 更早、更高效,还能防爬虫和恶意探测。
- 在 Nginx 的
server块中(对应 admin 子域名配置),加入:
if ($host != 'admin.yourdomain.com') {<br> return 403;<br>}
- 或者更严谨地用
map指令预定义白名单(适合多域名管理):
map $host $allowed_host {<br> default 0;<br> admin.yourdomain.com 1;<br>}
server {<br> if ($allowed_host = 0) { return 403; }<br> # 其他配置...<br>}
- 修改后重载 Nginx:
sudo nginx -t && sudo systemctl reload nginx
补充说明:为什么不用 Referer 或 CORS?
Referer 可被客户端随意伪造,完全不可信,不能用于权限控制。
CORS(跨域资源共享)解决的是浏览器同源策略下的前端请求限制,它不影响直接访问(比如用户手动输入 URL 或 Postman 请求),所以对“只允许某域名访问后台”这个需求无效。CORS 是前端发请求时的协商机制,不是服务端访问控制开关。










