ThinkPHP6 模板继承踩坑:我因为 `__STATIC__` 解析路径少写了一个斜杠,整站样式"裸奔"了半小时

站长杂谈 20 浏览 0 回复 返回上级

昨晚给项目换了个新主题,本地看着一切正常,打包上传之后刷新页面——好家伙,纯白背景配纯黑文字,F12 一看全是 404,CSS 和 JS 全炸了。那一刻我血压直接拉满,因为明明半小时前还在本地优雅地切着皮肤。

先说下背景。我这项目用的是 ThinkPHP6,模板继承结构大概是 base.htmlpublic/static 那套资源。本地开发时图省事,直接在模板里写了 {__STATIC__}css/style.css,注意看,前面没斜杠。本地 Windows 环境居然能跑,解析出来是 /static/css/style.css,浏览器自动补全了根路径,我就没当回事。

上传到 Linux 生产环境之后,{__STATIC__} 解析成了 static/css/style.css,少了开头的 /。然后因为当前页面 URL 是 /article/123.html,浏览器憨憨地去找 /article/static/css/style.css,可不就 404 全家桶了么。

更绝的是,我模板继承结构里,base.html<head> 块用了 {block name="css"}{/block},子模板里覆写的时候又套了一层相对路径。等于说子页面继承之后,资源路径基准还不一样——首页能加载,内页全挂,排查的时候一度怀疑是 CDN 缓存搞鬼,清了两遍缓存才发现方向错了。

最后怎么修的?把全站模板里的 {__STATIC__} 调用统一改成 {__STATIC__}/css/...,前面那个斜杠必须显式写上。TP6 的模板常量解析在不同 OS 下的行为差异,官方文档就提了一嘴,不踩一次根本记不住。

顺手把静态资源发布路径也理了一遍。之前 public 目录下 staticassets 混着用,有的走 Nginx 直接命中,有的被 ThinkPHP 的 .htaccess 兜了一圈。现在统一规范:public/static/ 放第三方库(Vue、Layui 这些),public/assets/ 放项目编译后的资源,Nginx 里对这两个目录直接 location ~* \.(css|js|png)$ 加缓存头,不再过 PHP。

还有个坑是模板继承里的 {include} 路径。我抽了个公共侧边栏 sidebar.html,放在 view/common/ 下,结果子模板里写 {include file="common/sidebar" /} 报错找不到。查了半天才发现,TP6 的 {include} 是基于当前模板目录解析的,如果子模板在 view/article/ 下,它去找的是 view/article/common/sidebar.html。正确写法是 {include file="../common/sidebar" /} 或者直接用完整路径 @common/sidebar(如果你配了模板路径映射的话)。

这次折腾完,我在 README.md 里给团队补了条铁律:所有模板资源路径必须以 / 开头,所有 {include} 必须写绝对定位。别信本地环境的"容错",Linux 生产环境专治各种侥幸心理。

你们有没有遇到过本地好好的、上线就裂开的模板继承问题?欢迎丢出来一起血压飙升。

评论0
回复 · 0
还没有回复
微信客服 微信客服