cdn加速本身不报错,报错的是路径、协议、权限或回源配置未对齐;常见表现为图片404、删除失败、上传500等,根源在于@uploadpath未定义或不可写、cdn回源路径与实际存储路径不一致、deleteurl未走cdn网关、assetbundle资源路径未适配cdn。

CDN加速本身不报错,报错的永远是路径、协议、权限或回源配置没对齐。最常遇到的不是“CDN报错”,而是 Yii 生成的 URL 还是 http://、文件写不进 @uploadPath、或 CDN 回源 404/403 —— 这些错误不会直接提示“CDN 失败”,而是表现为图片加载空白、删除按钮失效、上传后返回 500 或 404。
上传后返回 500:@uploadPath 别名未定义或目录不可写
这是最典型的“CDN 加速失败前兆”。upload() 方法内部调用 Yii::getAlias('@uploadPath'),如果没在 /common/config/bootstrap.php 中提前定义,会直接抛出 InvalidParamException,且错误堆栈里根本不会出现“CDN”字样。
- 检查
/common/config/bootstrap.php是否有这行:Yii::setAlias('@uploadPath', dirname(dirname(__DIR__)) . '/frontend/web/uploads'); - 确认该路径真实存在,且 Web 进程(如 www-data)对该目录有
write权限:ls -ld /path/to/frontend/web/uploads - 别用
Yii::getAlias('@webroot')拼接,@webroot是运行时解析的,可能指向错误位置;必须用物理路径定义@uploadPath
图片显示 404:CDN 回源路径与本地保存路径不一致
你代码里返回了 https://cdn.example.com/uploads/2026/08/17/abc.jpg,但 CDN 控制台配置的回源路径是 /uploads,而实际文件却存到了 /frontend/web/uploads/2026/08/17/ —— 这中间差了一个 frontend/web,导致回源请求变成 https://api.example.com/uploads/2026/08/17/abc.jpg,404。
- CDN 回源路径必须和
@uploadPath的末尾路径完全对齐。例如:@uploadPath = /var/www/myapp/frontend/web/uploads→ CDN 回源路径填/uploads(不能多也不能少) - 确保 Nginx/Apache 允许访问
/uploads/下所有子路径,且没加location ~ \.php$之类误拦截规则 - 用 curl 手动测试回源是否通:
curl -I https://api.example.com/uploads/2026/08/17/abc.jpg,看是否返回 200
fileinput 删除失败:deleteUrl 仍走源站而非 CDN 网关
fileinput 插件默认用 Url::to() 生成删除请求地址,结果发到 /uploads/delete?file=xxx,但这个路由只在源站存在,CDN 不转发 POST 请求(尤其带 body 的),直接 404 或 405。
- 必须显式覆盖
pluginOptions['deleteUrl'],设为一个由 CDN 代理的 endpoint,比如:'deleteUrl' => 'https://cdn.example.com/api/v1/upload/delete' - 该 endpoint 需在 Yii 控制器中实现,并配置 CORS 和 CSRF 排除(因为 CDN 无法携带 Yii 的 CSRF token)
- 别依赖插件自动推导,它不知道你启用了 CDN,也不会读取你返回的 CDN URL 字段
页面中图表/JS 404:AssetBundle 资源被 CDN 缓存但路径失效
如果你把 ECharts 改成本地 AssetBundle 加载,又开了 CDN 缓存,但没配好 assetManager 的 hashCallback 或 baseUrl,就会出现 JS 文件明明更新了,用户浏览器还加载旧版,或者 CDN 返回 404。
- Yii2 默认不支持资源哈希,CDN 缓存过期前用户永远看不到新 JS;必须手动改 AssetBundle 的
$publishOptions['forceCopy'] = true或换用 CDN 链接(推荐) - 若坚持用本地资源,需在
config/web.php中配置:'baseUrl' => 'https://cdn.example.com/assets',并确保assets/目录已同步到 CDN 源站 - 不要在
AppAsset中硬编码@web,它会生成http://链接;CDN 场景下所有静态资源 URL 必须强制走 HTTPS 域名
真正难调试的从来不是 CDN 本身,而是路径映射那一层——它横跨 Yii 别名、PHP 文件系统、Web 服务器路由、CDN 回源配置四道关卡,漏掉任意一环,错误都藏在 404 或 500 后面,不会告诉你“CDN 配错了”。











