You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:51:28