最近在 Halo 主题 theme-fuwari 里遇到一个非常迷惑的问题:后台配置里已经把 Banner 版权信息关掉了,但前端页面仍然会渲染 banner-credit。
这篇文章记录完整排查过程、根因和最终修复方案,避免后续踩坑。
问题现象
配置项:
theme.config.base.banner.credit.enable后台显示:已关闭(false)
前端实际:
#banner-credit仍然存在并显示
页面中对应模板代码最初是这样写的:
<th:block
th:if="${theme.config.base.banner.credit.enable}"
th:replace="~{modules/widgets/banner-credit}"
/>
第一轮排查:先确认是不是配置没保存
先在浏览器控制台验证真实配置值:
JSON.parse(document.getElementById('theme-config').textContent).base.banner.credit.enable
结果是 false。
说明配置本身是正确的,问题不在「后台没保存」。
第二轮排查:确认是不是前端 JS 动态插入
继续全局搜索:
banner-credittheme-configMounting widgets
结论:banner-credit 这个 DOM 不是 JS 动态创建的,主要来源仍是服务端模板渲染。
根因:th:if 和 th:replace 写在同一个标签
问题关键在于这行模板把 th:if 和 th:replace 同时放在一个标签上。
在 Thymeleaf 中,属性处理有优先级;th:replace 属于片段替换,执行优先级高,会导致看起来像是「th:if 没拦住」。
于是就出现了:
配置是
false但片段仍被替换进来
前端依然能看到
#banner-credit
正确修复:外层判断,内层替换
把「判断」和「替换」拆开,不要写在同一标签:
<th:block th:if="${theme.config.base.banner.credit.enable}">
<th:block th:replace="~{modules/widgets/banner-credit}" />
</th:block>
这样执行顺序就明确了:
先判断
enable仅在为
true时才执行片段替换
验证结果
enable = false:页面不再渲染#banner-creditenable = true:页面正常渲染#banner-credit
问题解决。