程序保存设置时把站点配置文件整份重写,为什么会盖掉自己加的规则

📅 2026-10-12 👁️ 0

程序保存设置时把站点配置文件整份重写,手工加的规则就会消失,原因是这类目录级配置文件只有一份,程序的写入逻辑按自己的模板整体生成,并不读取和保留既有内容。这不是配置写错了,而是所有权没有划分:同一个文件里既放着程序生成的重写规则,又放着运维追加的自定义条目,任何一方整份写入,另一方都会丢。

规则为什么会在某次保存后消失

典型现象是:改完后台的伪静态开关或保存一次站点设置,之前加的访问限制、跳转与缓存规则全部不见。同行的实现里能找到对应修复项,PbootCMS 在 V3.2.26 的更新记录中写明,修复的是 Apache 开启伪静态时误判环境、导致每次保存都覆盖站点目录配置文件的问题。这条记录的价值在于把成因说清楚了:程序在生成规则前对环境的判断出错,把「不该重写」的场景也当成需要重写,于是每一次保存都触发整份写入。

目录级配置文件的所有权问题

这类文件的位置在站点目录下,作用范围就是这一层及其子层。它可以同时承载重写规则、访问控制、错误页指向、缓存参数等多种内容,程序与运维都往这里写。要避免互相覆盖,只能按所有权切开:

  • 由程序管理的部分:伪静态重写规则、与站点结构绑定的路径映射;
  • 由运维管理的部分:手工跳转、访问限制、安全相关参数、缓存与压缩策略;
  • 两边都要读但不能同时写的部分:站点根路径的行为定义,改动前要先确认哪一方是权威来源。

怎么把两边规则分开维护

可行的划分方式有三种,共同点都是让程序只写它自己那份。

做法 具体安排 优点 要注意的地方
上层定义、下层不放 把运维规则写在站点之外的主配置里,目录级文件只留给程序 程序整份写入也不影响运维条目 需要主机配置权限,共享主机上常常拿不到
程序写独立片段 让重写规则指向单独文件,运维规则留在原文件 两边各写一处,互不覆盖 程序升级可能改回整份写入,要复验
手工条目纳入程序管理 通过后台入口维护跳转与规则,由程序统一生成 只有一份权威来源,不会丢 表达能力受后台功能范围限制

AnQiCMS 的伪静态规则由程序管理,支持自定义伪静态 URL,站点的重写条目按规则配置而不是靠手工编辑目录文件。走第三条路时更稳妥,代价是复杂条件要依赖后台提供足够的表达能力。

改完之后的验证清单

第一步,改动前先做备份。程序自带的备份能力应覆盖数据与静态文件,缺这一步时一次误覆盖就很难复原。第二步,把当前目录文件逐条抄成清单,保存设置后再逐条比对,看少掉的是哪几类规则,判断写入范围到底覆盖到哪一段。第三步,用一次「不修改任何选项、只点保存」的测试确认触发条件:如果整份文件被重写、内容却与之前一致,说明写入是无条件的;如果内容变化,说明程序按模板重新生成。第四步,验证伪静态效果与手工条目同时生效——分别请求一个规则内地址与一个规则外地址。第五步,把这条差异记进部署文档,并在每次程序升级后重跑第二、第三步,因为写入范围属于容易被版本更新改动的部分。

常见问题

问:能不能设成只读,阻止程序写入? 答:会让保存操作直接失败,程序认为写规则是保存流程的一部分。更可行的做法是把运维条目挪到程序不触碰的位置。

问:为什么本地正常、线上会丢规则? 答:多数差异在环境判断。程序需要知道站点用哪种服务器与是否开启重写,判断条件不满足时就会走到整份生成的分支。

问:手工加的跳转被覆盖之后怎么快速恢复? 答:从备份还原,然后把跳转改到上层配置或后台提供的重定向入口里,避免再次落在被程序重写的那份文件上。

相关文章

页面被别的站点嵌进去时,登录凭据按顶层站点分区是怎么回事

带分区属性的登录凭据会按顶层站点分开存储:同一个地址直接被访问时读到一份,被别的站点嵌进页面时读到另一份,两者不共享。官方文档写明该属性表示凭据应使用分区存储,并且设置它就必须同时设置安全标记,还建议用带主机名前缀的名字把凭据绑定到主机而非可注册域。站点若假定登录态全局共享,嵌入场景下就会读不到。

2026-10-12

前端监控里跨域图片的加载耗时全是零,该补哪个响应头

跨域图片的加载耗时在前端监控里读成零,缺的是计时放行响应头。官方文档的定义是:该头指定哪些来源被允许看到通过资源计时接口取到的属性值,否则这些值会因跨域限制被报告为零。取值可以是一个星号放开全部来源,也可以是逗号分隔的来源清单。它只影响计时读数,不改变资源的访问权限,所以补这个头解决的是归因问题,不是访问问题。

2026-10-12

首屏资源提前加载的中间响应码,为什么多数情况只在多路复用协议下发

用于首屏资源提前加载的 103 中间响应,是服务器还在组织最终页面时先发出的提示,客户端可以提前预连接或预加载资源。官方文档建议出于兼容与安全考虑只在 HTTP 协议 2 或更高版本上发送,多数浏览器也只在这个条件下支持。原因是旧协议下中间响应与最终响应之间的边界处理不一致,容易和等待中的响应内容混淆。

2026-10-12

安全响应头加了但有些响应里没有,状态码条件和层级继承怎么查

加了安全响应头却在部分响应里看不到,通常卡在两处:一是加头指令只在特定响应码生效,主流 Web 服务器文档列出的生效码包括二百段成功与三百段跳转,非成功响应要靠带 always 参数才无条件添加;二是层级继承规则——同层一旦定义了加头指令,上一层的整组定义就不再继承。排查顺序是先复现缺头的那个响应码,再定位它是哪一层配置生成的。

2026-10-12

列表查询显式指定索引反而更慢,什么情况下会退化成全表扫描

在列表查询里写死索引提示,等于让优化器放弃按统计信息选路径的机会:提示指向的索引与当前条件不匹配时,原本能走覆盖索引或范围扫描的查询会被推到代价更高的执行方式,条件失效时进一步退化成全表扫描。同行程序 PbootCMS 在 V3.2.26 更新记录里就修过列表标签因索引提示退化为全表扫描的问题,并把新装库统一改为按标题字段建索引。

2026-10-12

在线升级里的数据库脚本为什么要按版本顺序排,跑到一半失败该怎么办

在线升级的数据库脚本必须严格按版本号先后执行,因为每条脚本都以「前一条已经跑完」为前提:新字段还没建起来,后一条往里写值就会失败。跨版本升级时跳过中间版本,表结构会停在半路。脚本执行到一半失败,安全的做法是立刻中止并留下日志,而不是忽略错误继续跑完剩下的脚本,否则问题会被后面的脚本掩盖。升级前先做数据与静态文件备份,升级后逐段核对。

2026-10-12

把拦截名单写进一个文件,为什么会丢条目还越写越大

把登录拦截名单写进单个文件,在并发写入下很容易丢条目:两个请求同时读到同一份内容,各自追加后分别写回,后写入的那份覆盖前一份,被拦过的地址就此从名单里消失。没有容量上限的文件会持续增长,读取和解析的时间随之变长;格式不规则的畸形条目会让解析直接出错,导致名单整体失效。名单只是第一层,服务端仍要有独立的校验与验证码环节。

2026-10-12

核心公告的成因写着内置第三方库,站方除了等补丁还要看哪一段

成因写着内置第三方库的核心公告,漏洞不在站方自己写的代码里,却随核心一起分发,因此不能靠改自己的模板或业务代码规避,只能按核心的版本走。跟进时读三段:受影响区间的上下界决定你的版本是否命中,修复版本决定升级到哪一版,评级与利用条件决定排期的先后。以 Drupal 公告 SA-CORE-2026-013 为例,受影响区间跨三个分支,修复分别落在各分支的最新版。

2026-10-12