
本文介绍如何在 laravel 应用中使用自定义中间件校验 http referer,仅允许来自指定域名的请求访问登录页及后续页面,否则直接拒绝响应(不渲染任何视图)。
本文介绍如何在 laravel 应用中使用自定义中间件校验 http referer,仅允许来自指定域名的请求访问登录页及后续页面,否则直接拒绝响应(不渲染任何视图)。
在 Laravel 中,实现“仅允许特定来源跳转至登录页”的核心逻辑应置于HTTP 中间件(Middleware)中——这是请求进入应用后、路由分发前的关键拦截点,也是最符合安全与职责分离原则的实现位置。相比在控制器或登录方法中校验,中间件能统一管控所有 Web 请求(包括 /login 及其后续受保护路由),避免遗漏。
✅ 正确实现步骤
-
创建中间件
运行命令生成中间件类:php artisan make:middleware CheckReferrer
-
编写校验逻辑(推荐使用
request()->headers->get('referer'))
编辑app/Http/Middleware/CheckReferrer.php:<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class CheckReferrer { // 允许的来源域名(支持多个,含协议和端口) protected array $allowedHosts = [ 'https://trusted-domain.com', 'https://staging.trusted-domain.com', ]; public function handle(Request $request, Closure $next): Response { $referer = $request->headers->get('referer'); // 若无 Referer 或无法解析为有效 URL,则拒绝 if (empty($referer) || !filter_var($referer, FILTER_VALIDATE_URL)) { abort(403, 'Access denied: Invalid or missing referrer.'); } // 提取来源域名(含协议+主机名+端口) $parsed = parse_url($referer); $origin = sprintf('%s://%s%s', $parsed['scheme'], $parsed['host'], isset($parsed['port']) ? ':' . $parsed['port'] : ''); // 检查是否在白名单中 if (!in_array($origin, $this->allowedHosts)) { // 关键:不返回任何视图,直接终止响应(模拟“此网站无法访问”) return response('', 403)->header('Content-Type', 'text/plain'); } return $next($request); } }
⚠️ 注意事项:
- 不要使用
url()->previous():它依赖 session,可能为空或被篡改,且不反映真实 HTTP Referer;- 避免硬编码敏感域名:建议将
$allowedHosts移至配置文件(如config/app.php)或环境变量(.env);- Referer 可被客户端伪造:该方案适用于低敏感场景(如营销活动跳转控制),不可替代身份认证或权限系统;
- 若需兼容无 Referer 场景(如直接输入 URL、HTTPS→HTTP 跳转),请根据业务需求调整策略(例如允许空 Referer + 额外 token 校验)。
-
注册中间件到 Web 路由组
在app/Http/Kernel.php的$middlewareGroups['web']数组中,将中间件置于靠前位置(确保早于StartSession和Authenticate):'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \App\Http\Middleware\CheckReferrer::class, // ← 插入此处 \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], -
验证效果
Laravel Cloud下载Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- ✅ 从
https://trusted-domain.com点击链接跳转至yoursite.test/login→ 正常加载; - ❌ 从
https://evil.com或直接在浏览器地址栏输入 → 返回空白 403 响应,浏览器显示“此网站无法访问”或类似提示。
- ✅ 从
该方案精准契合“主入口拦截”需求:在 Laravel 生命周期最早可干预的稳定阶段(请求头解析后、路由匹配前)完成校验,既保障安全性,又保持架构清晰。










