cdn前缀未生效需检查view_replace_str配置是否映射__static__到cdn地址且清除runtime/view缓存;多环境应通过config('app.static_cdn')动态读取.env配置;js中禁用硬编码__static__,改用全局变量注入。

CDN前缀没生效?检查 __STATIC__ 是否被模板引擎正确解析
ThinkPHP 默认用 __STATIC__ 作为静态资源占位符,但这个字符串能否被替换成 CDN 地址,取决于两个关键动作是否完成:模板替换规则是否注册、模板缓存是否已清除。常见错误是改了配置却刷新页面还是本地路径,大概率是缓存没清或替换没配对。
-
__STATIC__不是硬编码进框架的,必须在view_replace_str配置里显式映射到真实 CDN 地址(比如https://cdn.example.com/static) - 修改配置后,务必删掉
runtime/view/下的缓存文件,否则旧模板仍按老规则渲染 - 如果用了
fetch()或display()手动加载模板,且传入的是绝对路径(如./template/index.html),那view_replace_str不起作用——它只对通过模板引擎加载的视图生效
多环境 CDN 切换:用配置驱动而非硬编码
开发时用本地路径,测试/生产切 CDN,靠 if-else 判断环境再拼接域名既难维护又容易漏。ThinkPHP 支持配置项动态读取,直接把 CDN 前缀抽成独立配置最稳妥。
- 在
config/app.php里加一项:'static_cdn' => env('STATIC_CDN', '/static') - 在
config/view.php的view_replace_str中引用:'__STATIC__' => config('app.static_cdn') - 这样只需在
.env文件里改STATIC_CDN=https://cdn.example.com/static,不用动代码,部署时也不怕误提交 - 注意
config()在 view 配置中可用,但不能用input()或request()—— 配置加载早于请求生命周期
模板里混用 __STATIC__ 和 __ROOT__?小心路径错乱
有些模板会同时出现 __STATIC__/js/app.js 和 __ROOT__/index.php,但两者语义不同:__ROOT__ 指向应用入口目录(含域名+PATH_INFO 前缀),而 __STATIC__ 应该只负责静态资源根路径。混用容易导致 CDN 加载失败或跨域问题。
-
__STATIC__替换值必须以/开头(如/static或https://cdn.example.com/static),否则可能被拼成相对路径 -
__ROOT__不建议用于静态资源,它受url_html_suffix、url_pathinfo_depr等影响,行为不稳定 - 如果项目启用了子目录部署(如
https://example.com/myapp/),__STATIC__必须配置为完整 URL,否则浏览器会尝试从myapp/static/加载资源
JS/CSS 内联样式里的 URL 怎么办?view_replace_str 不管用
模板里写 <style>body{background:url(__STATIC__/img/bg.png)}</style>,这种写法 view_replace_str 能处理;但如果是 JS 动态拼接的 URL(如 const url = '__STATIC__/data.json'),就完全绕过了模板替换逻辑。
- JS 中不要硬写
__STATIC__占位符,改用全局变量注入,例如在模板头部加:<script>window.STATIC_URL = '{@__STATIC__}';</script> - 确保
@__STATIC__写法启用(需开启tpl_begin/tpl_end配置,默认是{和}),否则@语法不识别 - 更彻底的做法是把所有静态资源路径收口到一个 JS 配置对象里,由 PHP 渲染后注入,避免前端重复判断环境
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











