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

Laravel Sail中为静态文件设置Access-Control-Allow-Origin头

给Laravel Sail(php artisan serve)的静态文件添加跨域响应头的方法

因为php artisan serve默认会直接返回public目录下的静态文件,不经过Laravel的请求处理流程,所以需要通过以下两种方式实现添加Access-Control-Allow-Origin: *响应头:

方法一:通过Laravel路由与中间件处理静态文件

  1. 创建跨域中间件
    执行命令生成中间件:

    php artisan make:middleware AddCorsHeaders
    

    打开app/Http/Middleware/AddCorsHeaders.php,修改handle方法:

    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);
        $response->header('Access-Control-Allow-Origin', '*');
        return $response;
    }
    
  2. 注册中间件
    在app/Http/Kernel.php中,将中间件添加到$middlewareGroups['web']数组:

    protected $middlewareGroups = [
        'web' => [
            // 其他中间件...
            \App\Http\Middleware\AddCorsHeaders::class,
        ],
        // ...
    ];
    
  3. 定义静态文件路由
    在routes/web.php末尾添加路由(确保在所有业务路由之后):

    Route::get('{file}', function ($file) {
        $filePath = public_path($file);
        if (!file_exists($filePath)) {
            abort(404);
        }
        return response()->file($filePath);
    })->where('file', '.*');
    

    所有静态文件请求会经过Laravel请求栈,自动带上跨域响应头。

方法二:自定义PHP内置服务器启动脚本

这种方式无需修改Laravel代码,直接接管静态文件响应:

  1. 在项目根目录创建server.php文件:

    <?php
    $uri = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
    
    // 处理静态文件请求
    if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
        $filePath = __DIR__.'/public'.$uri;
        // 设置跨域响应头
        header('Access-Control-Allow-Origin: *');
        // 设置正确的Content-Type
        $mime = mime_content_type($filePath);
        header("Content-Type: $mime");
        // 输出文件内容
        readfile($filePath);
        exit;
    }
    
    // 非静态文件请求交给Laravel处理
    require_once __DIR__.'/public/index.php';
    
  2. 修改Sail启动命令
    打开项目根目录的docker-compose.yml,找到laravel.test服务的command配置,替换为:

    command: php -S 0.0.0.0:80 server.php
    

    重启Sail生效:

    ./vendor/bin/sail down && ./vendor/bin/sail up -d
    

注意事项

  • php artisan serve仅适用于开发环境,生产环境建议使用Nginx/Apache等正式服务器,跨域头配置会更简便。
  • 方法一因经过Laravel请求栈,性能略低于方法二,但更贴合Laravel开发习惯。

内容的提问来源于stack exchange,提问作者superfive33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:47:22