通过路由或用户触发实现Web App公开发布的最优方案
最优实现方案
核心思路是用临时文件标识作为上线开关,不需要修改配置、不需要接入数据库,触发后实时生效,后续清理成本极低,完全匹配你的需求。
实现步骤
1. 修改现有domain_block中间件逻辑
调整判断规则,新增上线标识文件存在性校验:
public function handle(Request $request, Closure $next) { // 本地环境直接放行 if(App::environment('local')) { return $next($request); } // 检测上线标识文件是否存在 if (file_exists(storage_path('app/site_launched.lock'))) { return $next($request); } // 未触发上线时返回待发布页面 return new Response(view('layouts.coming-soon')); }
2. 新增临时上线触发接口
单独加一条不需要走domain_block中间件的路由,做简单的权限校验后生成标识文件:
// 临时上线触发路由,发布会结束后可直接删除 Route::get('/admin/trigger-launch', function () { // 提前预设一个只有负责人知道的秘钥,防止误触发 if (request()->input('secret') !== '你自定义的高复杂度随机秘钥') { abort(403); } // 生成上线标识文件 file_put_contents(storage_path('app/site_launched.lock'), 'launched at '.date('Y-m-d H:i:s')); return '站点已成功开放访问'; });
操作流程
- 发布会前提前把上述代码改动部署到生产环境,此时没有标识文件,用户访问仍然显示coming soon页面,不影响正常预热
- 发布会到上线环节时,将拼接好秘钥的触发链接发给机构负责人,负责人点击链接即可完成上线,所有用户刷新页面就能正常访问站点,全程不需要等待构建部署,秒级生效
- 发布会结束后,你可以直接删除domain_block中间件、临时触发路由,以及storage/app下的site_launched.lock文件即可,没有任何遗留代码负担
方案优势
- 完全规避配置缓存问题:文件存在性判断是实时IO读取,不需要清缓存、不需要重新构建
- 无额外依赖:不需要修改数据库、不需要接入第三方服务,仅用Laravel原生能力即可实现
- 操作成本极低:负责人仅需点击一次链接即可完成操作,适合发布会场景
- 后续清理简单:临时代码和标识文件均可直接删除,不会对后续业务产生影响
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

