ThinkPHP需手动配置CDN:通过app.php的static_domain控制url()类调用,但__STATIC__常量需动态assign覆盖;须配合版本号或hash防缓存失效,并全面检查模板路径一致性。

ThinkPHP 本身不自动处理 CDN,必须手动配置静态资源 URL 基础路径,否则 __STATIC__、__CSS__ 等模板常量仍指向本地地址。
修改 app.php 中的 static_domain 配置项
ThinkPHP 6.0+ 支持通过 app.php 的 static_domain 选项统一替换静态资源域名。该配置仅影响模板中 {:url('@static/xxx')} 或 {:file_url('xxx.css')} 这类调用,不影响硬编码路径。
- 在
config/app.php中添加或修改:'static_domain' => 'https://cdn.example.com'
- 模板中使用
{:url('@static/js/app.js')}→ 渲染为https://cdn.example.com/static/js/app.js - 若值为空字符串或
null,则回退到默认相对路径 - 注意:此配置对
__STATIC__常量无效——它由系统在编译时写死,不会动态替换
重写 __STATIC__ 等模板常量的生成逻辑
ThinkPHP 默认在 think\template\driver\File.php 中定义 __STATIC__,但无法直接覆盖。更稳妥的方式是在视图初始化阶段动态注入 CDN 域名。
- 在控制器基类或中间件中,于渲染前执行:
$this->assign('__STATIC__', 'https://cdn.example.com/static'); - 确保所有模板都使用
{$__STATIC__}/css/app.css而非硬编码/static/css/app.css - 若使用多环境(如本地开发不用 CDN),可结合
Env::get('app_debug')判断是否启用 - 不要试图修改框架源码中的常量定义——升级后会被覆盖,且易出错
避免 CDN 缓存导致的 JS/CSS 更新不生效
CDN 缓存静态文件是双刃剑:加速访问,但也可能让用户加载旧版本资源。
立即学习“PHP免费学习笔记(深入)”;
- 强制版本号:在 URL 后加时间戳或哈希,例如
{$__STATIC__}/js/app.js?v={:time()}(仅限调试) - 生产环境推荐使用构建工具(如 Vite、Webpack)生成带 hash 的文件名,再配合 ThinkPHP 的
build.php资源映射功能 - CDN 后台需设置缓存规则:对
.js、.css文件启用「忽略参数」但「校验文件名 hash」,对无 hash 的文件(如logo.png)设较短缓存期 - 切勿全局关闭 CDN 缓存——会失去加速意义,还增加源站压力
真正麻烦的不是配 CDN 域名,而是模板里混用 __STATIC__、url('@static/...') 和绝对路径;一旦漏掉一处,那个文件就永远走不了 CDN。上线前最好用浏览器 DevTools 的 Network 面板逐个检查静态请求的域名。



















