ThinkPHP 配置 CDN 加速失败主因是回源路径未指向 /public、静态资源 URL 未统一用 asset() 或 STATIC 生成、缓存规则未区分动静态内容。

ThinkPHP 配置 CDN 加速出问题,八成卡在路径、缓存、回源这三处。不是框架不支持,而是动静没分清、URL 没统管、CDN 规则没对齐。
回源路径必须指向 /public 目录
CDN 节点请求 /static/css/app.css 时,会回源到你的服务器。如果回源地址是项目根目录(如 /var/www/myapp),它就找不到这个文件——因为 ThinkPHP 要求所有静态资源必须从 public/ 下被访问。
- 在 CDN 控制台里,把「回源路径」明确设为
/public(注意:阿里云需带末尾斜杠/public/,腾讯云建议不带,以curl -I https://your-cdn.com/static/css/app.css返回 200 为准) - 同时确认 Web 服务器(Nginx/Apache)的站点根目录也指向
/var/www/myapp/public,不是项目根目录 - 别在
public外再建static目录——框架不识别,CDN 也映射不上
静态资源 URL 必须用 asset() 或 __STATIC__ 统一生成
硬写 <link href="/static/css/app.css"> 是最大隐患:本地能跑,上线 CDN 后全断链。路径写死 = 失去适配能力。
- 模板中统一用
{:asset('css/app.css')}(TP6/TP8)或{__STATIC__/css/app.css} - 在
config/view.php中配置:'tpl_replace_string' => ['__STATIC__' => env('STATIC_DOMAIN', '/static')] - 生产环境
.env写STATIC_DOMAIN=https://cdn.example.com/static,开发环境留空或写/static - 别用
__ROOT__拼接静态路径——它和 CDN 无关,只会输出本地入口路径
缓存规则要严格区分动静内容
CDN 一旦缓存了 PHP 路由(比如 /index.php 或 /api/user),用户就会看到过期 HTML、503 错误,甚至登录态错乱。
立即学习“PHP免费学习笔记(深入)”;
- 在 CDN 缓存规则中,对
*.php、/api/*、/admin/*等路径,强制设为「不缓存」或缓存时间 0 秒 - 只对明确静态后缀开启缓存:
*.css、*.js、*.png、*.woff2,缓存时间可设为 1 年(max-age=31536000) - 检查响应头:访问一个 CSS 文件,应返回
Cache-Control: public, max-age=31536000;访问任意路由,必须是no-cache, no-store, must-revalidate - 关闭 CDN 的「HTML 重写」「JS 自动合并」等功能——它们会篡改模板里的 PHP 链接或相对路径
权限与协议细节不能忽略
403 Forbidden 和混合内容警告(Mixed Content),往往不是 CDN 配置问题,而是服务器或协议层面的疏漏。
-
public/static/目录需确保 Web 服务用户(如 www-data 或 nginx)有读取权限,避免 403 -
app.asset_host或STATIC_DOMAIN必须带完整协议(https://),否则 HTTPS 站点加载 HTTP 资源会被浏览器拦截 - CDN 回源 Host 头要填源站真实域名(如
www.example.com),不能是 IP 或空值,否则 Nginx 虚拟主机匹配失败 - 源站需识别
X-Forwarded-Proto头,确保request.isSsl()等逻辑正常,防止跳转循环



















