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

如何将Laravel项目下载链接域名从site.com切换为dl.site.com

Laravel下载路由域名修改方案

方案1:给路由指定专属域名(推荐)

直接在路由定义中绑定dl域名,后续调用route()或signedRoute()生成链接时会自动使用指定域名,无需额外处理。

  1. 先修改路由配置:
// 单个路由直接绑定域名
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');
  1. 处理签名验证问题
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:45:04