织梦运维排错手册

织梦css样式缓存刷新办法

织梦改了 CSS 文件,浏览器死活不更新,这是建站过程中最常见的折磨之一。缓存可能卡在浏览器、织梦静态页、CDN、甚至服务器 OPcache 多个环节。要彻底解决,得逐层排查。本文给出从最简单到最彻底的完整方案。

一、缓存不刷新的四大原因

  1. 浏览器缓存 —— 浏览器为了加速,缓存了旧版 CSS
  2. 织梦静态页未重新生成 —— HTML 里引用的还是旧 CSS 路径或旧版本号
  3. CDN 缓存 —— 用了 CDN 但没刷新节点缓存
  4. 服务器 OPcache —— PHP 字节码缓存导致动态生成的 CSS 版本号不更新

排查顺序建议从上到下,先排除浏览器,再处理织梦,最后看 CDN 和服务器。

一、浏览器层:强制刷新

最快的方法:

  • Windows:Ctrl + F5Ctrl + Shift + R
  • Mac:Cmd + Shift + R
  • Chrome DevTools 打开后,在刷新按钮上右键 → “清空缓存并硬性重新加载”

如果只是自己测试,这样就能解决。但访客不会强制刷新,所以根本办法是给 CSS 加版本号。

二、核心方案:CSS 加版本号

给 CSS 引用地址加查询参数,浏览器会认为是新文件:

<link rel="stylesheet" href="/style.css?v=20260729">

每次改 CSS 后把 v 值改大,所有访客都会自动加载新版。手动改太麻烦,推荐两种自动化写法:

写法一:用时间戳(织梦模板里)

<link rel="stylesheet" 
  href="/style.css?v={dede:global.cfg_cmspath/}/css/style.css">
<!-- 或用 PHP -->
<link rel="stylesheet" 
  href="/style.css?v=<?php echo filemtime(DEDEROOT.'/style.css'); ?>">

filemtime 取文件修改时间戳,CSS 一改动版本号自动变,是最优雅的方案。

写法二:在公共头部 head.htm 里统一管理

<?php
$css_ver=filemtime(DEDEROOT.'/templets/default/style/style.css');
?>
<link rel="stylesheet" 
  href="/templets/default/style/style.css?v=<?php echo $css_ver; ?>">

这样全站 CSS 引用都用同一个版本号变量,改一处全站生效。

三、织梦静态页重新生成

织梦是静态生成机制,改了模板或 CSS 引用后,必须重新生成 HTML 才能让页面引用新 CSS。操作路径:

  1. 后台 → 生成 → 更新主页 HTML
  2. 后台 → 生成 → 更新栏目 HTML(选全部栏目)
  3. 后台 → 生成 → 更新文档 HTML(按需全量或按时间)
如果只改了 CSS 文件内容,没动模板,理论上不用重新生成(因为 CSS 路径没变,浏览器靠版本号判断)。但用了版本号方案后,版本号是 PHP 动态输出的,静态页里写死的是生成那一刻的版本号,CSS 再改就需要重新生成一次让版本号更新。

四、CDN 缓存刷新

站点接了 CDN(阿里云、腾讯云、Cloudflare 等)后,CDN 节点会缓存 CSS 文件。即使源站更新了,CDN 节点没刷新,访客拿到的还是旧版。处理方式:

  • 登录 CDN 控制台 → 缓存刷新 → 提交 CSS 文件 URL
  • 或刷新整个目录
  • 设置 CSS 缓存规则时,把带 ?v= 参数的文件缓存时间设短,或设为不缓存

配合版本号方案,CDN 会把 style.css?v=1style.css?v=2 当作两个不同文件,自动不会命中旧缓存,是最省心的组合。

五、服务器 OPcache 清理

如果用 PHP 动态输出 CSS 版本号,但版本号死活不变,可能是 OPcache 缓存了 PHP 字节码。清理方法:

# 重启 PHP-FPM
systemctl restart php-fpm

# 或在 PHP 里调用清理
<?php
if(function_exists('opcache_reset')){
  opcache_reset();
}
?>

宝塔面板用户可在“软件商店 → PHP → 设置 → 缓存组件”里关闭 OPcache 或一键清理。

六、织梦 data/cache 目录清理

织梦自身有标签缓存机制,存在 /data/cache/ 目录。如果 arclist 等标签的输出不更新,清理这个目录:

# 删除缓存文件(保留目录)
rm -f /data/cache/*.cache
rm -f /data/cache/arclist*

或在后台 → 系统 → 清理系统缓存 → 一键清理。注意这个缓存只影响标签输出,不影响 CSS 文件本身,但有时会导致页面 HTML 不更新从而连带 CSS 引用不刷新。

七、调试技巧

  • Chrome DevTools → Network → 勾选“Disable cache”,开发时始终禁用缓存
  • 看 CSS 文件的 Response Headers,Cache-ControlETag 决定缓存行为
  • 对比源站和 CDN 返回的 CSS 内容是否一致,用 curl -I URL 看 headers
  • 织梦后台的“系统基本参数 → 性能选项”里关闭 arclist 缓存(开发期),上线再开

八、长期预防方案

把 CSS 版本号机制写进模板基线,一劳永逸:

// 在 head.htm 顶部定义
<?php
define('ASSET_VER', filemtime(DEDEROOT.'/style.css'));
?>

// 所有静态资源引用统一用
<link rel="stylesheet" href="/style.css?v=<?php echo ASSET_VER; ?>">
<script src="/main.js?v=<?php echo ASSET_VER; ?>"></script>

这样 CSS 和 JS 任何改动都会自动触发版本号更新,配合 CDN 的“参数差异化缓存”策略,访客永远拿到最新资源。

缓存问题排查时建议养成“自下而上”的习惯:先 curl 直接请求源站确认文件已更新,再过 CDN 看是否一致,最后到浏览器。这样能快速锁定问题出在哪一层,避免在浏览器里反复 Ctrl+F5 浪费时间。把版本号机制固化到模板里,后续改样式就再也不用担心缓存了。