已配置serve_assets,如何在Laravel Vapor中发布manifest.webmanifest文件?
当前404问题的核心触发逻辑是:VaporCli部署阶段的资产扫描组件Laravel\VaporCli\AssetFiles内置了硬编码的文件排除规则,会自动跳过*.webmanifest、manifest.json、mix-manifest.json三类文件的上传流程——仅配置serve_assets参数只会触发静态资源路由的匹配规则,并不会触发对应文件的上传流程,最终会因为S3桶中无对应文件,导致CloudFront返回404。
这类过滤规则的设计初衷,是避免把前端构建工具生成的、仅用于内部构建流程的中间清单文件误上传到公共静态资源桶,但对于开发者手动放置在public目录、需要对外直接访问的自定义manifest.webmanifest文件,就会出现被误过滤的问题。
可落地的解决方案如下:
方案1:扩展资产扫描规则,移除webmanifest类文件的过滤
该方案最贴合Vapor原生部署流程,不需要额外修改资产打包路径逻辑:
- 在项目的
app/Providers/AppServiceProvider.php的register方法中,通过服务容器重写VaporCli的资产扫描器绑定逻辑,将webmanifest文件从默认排除列表中移除:
// app/Providers/AppServiceProvider.php public function register() { $this->app->bind(\Laravel\VaporCli\AssetFiles::class, function ($app) { return new class(public_path()) extends \Laravel\VaporCli\AssetFiles { protected function defaultExclusions() { // 调用父类获取默认排除规则后,移除*.webmanifest的匹配项 $exclusions = parent::defaultExclusions(); return array_filter($exclusions, fn($pattern) => $pattern !== '*.webmanifest'); } }; }); }
- 保持
vapor.php中'serve_assets' => ['manifest.webmanifest']的原有配置不变,重新触发部署流程,此时对应文件会被正常扫描并上传到S3静态资源桶。 - 注意:该方案依赖VaporCli的AssetFiles类结构稳定,若后续VaporCli大版本升级调整了类的方法签名,需要对应调整重写逻辑
方案2:通过构建钩子手动上传目标文件,绕开内置过滤
如果不想改动服务容器绑定逻辑,可以利用Vapor的构建钩子在资产打包阶段手动把目标文件加入上传列表:
- 在项目根目录的
vapor.yml对应环境的build配置块中,添加文件复制命令:
# vapor.yml 示例结构 id: 你的项目部署ID name: 你的项目名称 environments: production: build: # 先执行原有构建命令 - 'npm run build' # 手动把manifest文件复制到VaporCli的待上传资产目录,绕开public目录扫描的过滤规则 - 'cp public/manifest.webmanifest ./vendor/laravel/vapor-cli/assets/manifest.webmanifest' # 保持原有静态资源配置 serve_assets: - manifest.webmanifest
- 该命令会在VaporCli启动资产打包流程前,把public目录下的manifest文件直接放入待上传资产根目录,跳过public目录扫描阶段的过滤规则,直接被打包上传到S3。
方案3:通过应用路由提供文件访问能力,不依赖静态资源服务
如果不想调整资产打包链路,可以直接走Laravel应用路由返回manifest文件,完全绕开静态资源上传流程:
- 在
routes/web.php中添加对应访问路由,返回带正确MIME类型的文件响应:
// routes/web.php Route::get('/manifest.webmanifest', function () { return response()->file(public_path('manifest.webmanifest'), [ 'Content-Type' => 'application/manifest+json', 'Cache-Control' => 'public, max-age=31536000' ]); });
- 配置注意事项:需要在
vapor.php中移除该路径的serve_assets配置,避免CloudFront优先匹配静态资源代理规则触发404;该方案更适合文件体积小、访问量不高的场景。
内容的提问来源于stack exchange,提问作者Martijn Gastkemper
相关产品推荐
相关产品推荐

