yii2 assetbundle 通过 assetmanager 的 baseurl 统一配置 cdn 前缀实现资源外链,需在 config/web.php 中设置 baseurl,禁用 sourcepath 并避免硬编码路径。

Yii2 的 AssetBundle 本身不生成或打包资源,只负责把已构建好的静态文件“挂载”到页面上。要让资源走 CDN,关键不是改文件路径,而是通过 assetManager 组件统一替换所有资源的 URL 前缀——这是最安全、最可控的方式。
核心配置:在 assetManager 中设置 baseUrl
CDN 替换必须在 config/web.php 的 components 中配置 assetManager:
- 生产环境直接指定 CDN 域名:
'baseUrl' => YII_ENV_PROD ? 'https://static.example.com' : '@web' - 域名必须是完整协议+主机名,不能带路径后缀(如
https://static.example.com/cdn会出错) -
basePath保持默认或明确设为@webroot/assets,它只控制服务器端物理位置,不影响前端 URL
第三方 Bundle 的 baseUrl 覆盖
有些扩展(如 yii2-grid)在类里硬编码了 baseUrl,不会自动继承全局配置。需在 assetManager['bundles'] 中单独覆盖:
'kartik\grid\GridViewAsset' => ['baseUrl' => 'https://static.example.com']'yii\web\JqueryAsset' => ['baseUrl' => 'https://cdn.jsdelivr.net/npm/jquery@3.6.0']- 注意:若完全禁用某 Bundle(如
'yii\web\JqueryAsset' => false),则需自行引入 CDN 链接
避免手动改资源路径或硬编码 CDN
以下做法容易出问题,应避免:
- 在
AppAsset.php的$css或$js数组中直接写 CDN 地址(如['https://xxx/css/site.css'])——会绕过 AssetBundle 依赖管理和版本控制 - 修改
$sourcePath指向 CDN 目录——sourcePath必须是本地可读路径,否则发布失败 - 用
@web别名拼接 CDN(如@web/js/app.js)——@web是动态解析的,无法指向外部域名
CDN 与构建工具协同要点
如果项目已用 Webpack/Vite 构建,产出在 dist/ 目录,建议跳过 Yii 的发布流程:
- 将
dist/目录软链或复制到@webroot/static,然后在assetManager中设'baseUrl' => '@web/static' - 或直接设
'baseUrl' => 'https://static.example.com',并确保 CDN 源站同步dist/内容 - 此时应禁用 Yii 的自动发布:
'forceCopy' => false,且不设$sourcePath,只靠$basePath+$baseUrl映射











