正确做法是让__STATIC__动态生成CDN地址:在app/common.php中定义define('__STATIC__', config('app.cdn_url') ?: ROOT . '/static'),并通过.env配置CDN_URL。
CDN 域名怎么配进
?别硬写死在模板里
ThinkPHP 默认用
替换静态资源路径,但这个常量默认指向本地
。直接在模板里写
,后续切 CDN 就得全局替换,极易出错。
正确做法是让
动态生成 CDN 地址:
在
或应用初始化文件中定义:
在
加配置项:
部署时通过环境变量控制,例如
中写
;本地开发留空,自动回退到本地路径
注意:不要在视图中用
拼接,会破坏缓存一致性;
必须是常量或一次性计算值,否则模板编译后无法复用
开启压缩失败?检查资源路径和入口文件位置
ThinkPHP 的静态资源构建(压缩、合并、加 hash)依赖
配置,但很多人运行
后发现 CSS/JS 没变化,或报
错误。
立即学习
“
PHP免费学习笔记(深入)
”;
根本原因通常是路径不匹配:
中的
必须是相对于项目根目录的路径,例如
,不是
也不是
入口文件
的位置影响
计算,若用了子目录部署(如
),需同步调整
的
和 URL 映射
JS/CSS 文件必须是纯前端资源,不能含 PHP 逻辑(比如
),否则压缩器会跳过或报语法错误
一个最小可用的
片段:
开启 Gzip 压缩但浏览器没生效?确认 Web 服务器配置优先级
ThinkPHP 自身不处理 HTTP 压缩,
配置只对 PHP 输出缓冲起作用,且仅限文本响应(对静态文件无效)。很多开发者开了
,却发现 JS/CSS 文件没被压缩。
真正起效的是 Web 服务器层:
Nginx:必须在 server 块中启用
,并确保
包含
Apache:需开启
,并在
或虚拟主机配置中添加压缩规则
CDN 层(如 Cloudflare、阿里云 CDN):单独设置「压缩静态文件」开关,它会覆盖源站响应头,此时源站是否开 Gzip 不影响最终效果
验证方法:用 Chrome DevTools → Network → 点开某个 JS 文件 → 查看 Response Headers 是否有
;没有则说明某一层断掉了
资源加 hash 后页面仍加载旧文件?清除三处缓存链
启用文件哈希(如
或重命名成
)本意是强制更新,但用户打开页面还是旧样式,常见于以下三个环节未同步清理:
浏览器缓存:HTML 页面本身可能被强缓存(
),导致内联的
地址没刷新 —— 解决办法是 HTML 不缓存,或用版本号控制 HTML
ThinkPHP 模板缓存:修改了
并重新构建,但模板里还缓存着旧的
路径 —— 运行
清除
CDN 缓存:CDN 把旧的
缓存了,即使你已上传新文件,CDN 仍返回旧版 —— 必须主动刷新该资源 URL 或设置较短的缓存 TTL(如
)
最稳妥的做法是:构建后自动生成资源映射表(如
),模板中通过函数读取真实文件名,而不是靠人工拼接或静态替换
__STATIC____STATIC__public/static/__STATIC__app/common.phpdefine('__STATIC__', config('app.cdn_url') ?: __ROOT__ . '/static');config/app.php'cdn_url' => env('CDN_URL', ''),.envCDN_URL=https://cdn.example.com{:config('app.cdn_url')}__STATIC__build.phpbuild.phpphp think buildfile not foundbuild.phpsourcePathpublic/static./public/staticstaticpublic/index.php__ROOT__https://example.com/app/build.phptargetPathxxx.js.phpbuild.phpreturn [
'sourcePath' => 'public/static',
'targetPath' => 'public/static/min',
'ignore' => ['.git', '.svn', 'demo.html'],
];output_compress'output_compress' => truegzip ongzip_typestext/css application/javascriptmod_deflate.htaccesscontent-encoding: gzipapp.css?v=abc123app.abc123.cssCache-Control: max-age=31536000build.php__STATIC__/css/app.cssphp think clear:templateapp.cssmax-age=3600version.json