如何将Laravel项目下载链接域名从site.com切换为dl.site.com
Laravel下载路由域名修改方案
方案1:给路由指定专属域名(推荐)
直接在路由定义中绑定dl域名,后续调用route()或signedRoute()生成链接时会自动使用指定域名,无需额外处理。
- 先修改路由配置:
// 单个路由直接绑定域名 Route::get('dl/course/{id}/{slug}', [DownloadsController::class, 'downloadDemo']) ->domain('dl.example.com') // 新增这行绑定专属下载域名 ->name('front.download.demo') ->middleware('signed');
如果需要兼容多环境,不要硬编码域名,可按以下方式配置:
- 在
.env文件新增下载域名配置
DOWNLOAD_DOMAIN=dl.example.com
- 在
config/app.php中新增配置项
'download_domain' => env('DOWNLOAD_DOMAIN'),
- 路由修改为读取配置
Route::get('dl/course/{id}/{slug}', [DownloadsController::class, 'downloadDemo']) ->domain(config('app.download_domain')) ->name('front.download.demo') ->middleware('signed');
- 处理签名验证问题
Laravel默认的signed中间件会验证完整URL包括域名,域名变更后会出现签名校验失败的问题,有两种解决方式:
- 方式一:替换默认signed中间件,在控制器中手动校验时忽略域名
// 先移除路由的signed中间件,然后在控制器方法中手动校验 public function downloadDemo(Request $request, $id, $slug) { // 忽略host参数校验签名 if (! $request->hasValidSignatureWhileIgnoring(['host'])) { abort(403, '无效的下载链接'); } // 原有下载逻辑 }
- 方式二:如果下载主机也部署了完整Laravel代码,直接将下载主机的
.env中APP_URL修改为https://dl.example.com即可正常校验。
方案2:生成链接时手动替换域名
如果不想修改原有路由定义,可以在生成签名链接后手动替换域名:
// 生成原有签名链接 $originalSignedUrl = URL::signedRoute('front.download.demo', [ 'id' => 13, 'slug' => 'mvc' ]); // 替换域名 $downloadUrl = str_replace(env('APP_URL'), 'https://dl.example.com', $originalSignedUrl);
签名校验的处理逻辑和方案1一致。
额外注意事项
- 需提前将
dl.example.com域名解析到新的专属下载主机 - 下载主机的Web服务(Nginx/Apache)需要配置对应站点规则,保证
/dl/course/{id}/{slug}路径的请求能正常转发到处理逻辑 - 如果下载主机仅负责下载分发,可配置反向代理将请求转发到主站校验签名后再返回文件,避免重复部署代码
内容的提问来源于stack exchange,提问作者johnDoe220
相关产品推荐
相关产品推荐

