Laravel Sail中为静态文件设置Access-Control-Allow-Origin头
给Laravel Sail(php artisan serve)的静态文件添加跨域响应头的方法
因为php artisan serve默认会直接返回public目录下的静态文件,不经过Laravel的请求处理流程,所以需要通过以下两种方式实现添加Access-Control-Allow-Origin: *响应头:
方法一:通过Laravel路由与中间件处理静态文件
创建跨域中间件
执行命令生成中间件: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; }注册中间件
在app/Http/Kernel.php中,将中间件添加到$middlewareGroups['web']数组:protected $middlewareGroups = [ 'web' => [ // 其他中间件... \App\Http\Middleware\AddCorsHeaders::class, ], // ... ];定义静态文件路由
在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代码,直接接管静态文件响应:
在项目根目录创建
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';修改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
相关产品推荐
相关产品推荐

