Laravel如何限制后端仅接受来自neofrontend.com的请求
问题背景
域名为neofrontend.com的前端站点需要对后端做访问限制,仅接受来自该域名的请求。
最初实现的校验中间件代码如下:
public function handle(Request $request, Closure $next) { if( $request->getHost() !== 'neofrontend.com' && $request->getHost() !== '127.0.0.1' ) { return response("El host {$request->getHost()} no es compatible ", 400); } return $next($request); }
运行后中间件始终返回后端自身的主机名,无法正确识别请求来源。
补充操作:已在cors.php中添加配置'allowed_origins' => ['*.neofrontend.com'],但配置未生效。
错误原因
$request->getHost()方法获取的是当前请求访问的后端服务自身的主机名,并非发起请求的前端来源地址,因此取值永远是后端自身域名/IP,校验逻辑从根本上不成立。- CORS配置的
allowed_origins仅作用于浏览器跨域场景,本身不是服务端层面的请求拦截手段,且配置的通配规则*.neofrontend.com仅匹配neofrontend.com的二级子域名,根域名neofrontend.com本身不在匹配范围内,自然不会生效。
修复方案
1. 用正确字段获取请求来源
前端发起的跨域请求会在请求头中携带Origin字段标识来源,Laravel中可通过$request->headers->get('origin')拿到该值,以此作为来源校验的依据。
2. 重写中间件校验逻辑
参考代码如下:
public function handle(Request $request, Closure $next) { $origin = $request->headers->get('origin'); // 配置允许的来源列表,包含正式生产地址和本地开发地址 $allowedOrigins = [ 'https://neofrontend.com', 'http://127.0.0.1', 'http://localhost' ]; // 无Origin头说明是非跨域请求(如后端内部调用、同源访问),直接放行 if (is_null($origin)) { return $next($request); } // 来源不在白名单内直接拦截返回403 if (!in_array($origin, $allowedOrigins)) { return response("请求来源 {$origin} 无访问权限", 403); } return $next($request); }
3. 修正CORS配置
前后端分离部署存在跨域时,同步修改config/cors.php中的允许来源配置,和中间件白名单保持一致:
'allowed_origins' => [ 'https://neofrontend.com', 'http://127.0.0.1', 'http://localhost' ],
注意:CORS规则仅在浏览器端生效,无法拦截Postman、自定义脚本等非浏览器客户端发起的请求,不能作为来源限制的唯一手段,必须通过服务端中间件做强制校验。
内容的提问来源于stack exchange,提问作者Jorge Tirado Sandoval
相关产品推荐
相关产品推荐

