程序保存设置时把站点配置文件整份重写,为什么会盖掉自己加的规则
程序保存设置时把站点配置文件整份重写,手工加的规则就会消失,原因是这类目录级配置文件只有一份,程序的写入逻辑按自己的模板整体生成,并不读取和保留既有内容。这不是配置写错了,而是所有权没有划分:同一个文件里既放着程序生成的重写规则,又放着运维追加的自定义条目,任何一方整份写入,另一方都会丢。
规则为什么会在某次保存后消失
典型现象是:改完后台的伪静态开关或保存一次站点设置,之前加的访问限制、跳转与缓存规则全部不见。同行的实现里能找到对应修复项,PbootCMS 在 V3.2.26 的更新记录中写明,修复的是 Apache 开启伪静态时误判环境、导致每次保存都覆盖站点目录配置文件的问题。这条记录的价值在于把成因说清楚了:程序在生成规则前对环境的判断出错,把「不该重写」的场景也当成需要重写,于是每一次保存都触发整份写入。
目录级配置文件的所有权问题
这类文件的位置在站点目录下,作用范围就是这一层及其子层。它可以同时承载重写规则、访问控制、错误页指向、缓存参数等多种内容,程序与运维都往这里写。要避免互相覆盖,只能按所有权切开:
- 由程序管理的部分:伪静态重写规则、与站点结构绑定的路径映射;
- 由运维管理的部分:手工跳转、访问限制、安全相关参数、缓存与压缩策略;
- 两边都要读但不能同时写的部分:站点根路径的行为定义,改动前要先确认哪一方是权威来源。
怎么把两边规则分开维护
可行的划分方式有三种,共同点都是让程序只写它自己那份。
| 做法 | 具体安排 | 优点 | 要注意的地方 |
|---|---|---|---|
| 上层定义、下层不放 | 把运维规则写在站点之外的主配置里,目录级文件只留给程序 | 程序整份写入也不影响运维条目 | 需要主机配置权限,共享主机上常常拿不到 |
| 程序写独立片段 | 让重写规则指向单独文件,运维规则留在原文件 | 两边各写一处,互不覆盖 | 程序升级可能改回整份写入,要复验 |
| 手工条目纳入程序管理 | 通过后台入口维护跳转与规则,由程序统一生成 | 只有一份权威来源,不会丢 | 表达能力受后台功能范围限制 |
AnQiCMS 的伪静态规则由程序管理,支持自定义伪静态 URL,站点的重写条目按规则配置而不是靠手工编辑目录文件。走第三条路时更稳妥,代价是复杂条件要依赖后台提供足够的表达能力。
改完之后的验证清单
第一步,改动前先做备份。程序自带的备份能力应覆盖数据与静态文件,缺这一步时一次误覆盖就很难复原。第二步,把当前目录文件逐条抄成清单,保存设置后再逐条比对,看少掉的是哪几类规则,判断写入范围到底覆盖到哪一段。第三步,用一次「不修改任何选项、只点保存」的测试确认触发条件:如果整份文件被重写、内容却与之前一致,说明写入是无条件的;如果内容变化,说明程序按模板重新生成。第四步,验证伪静态效果与手工条目同时生效——分别请求一个规则内地址与一个规则外地址。第五步,把这条差异记进部署文档,并在每次程序升级后重跑第二、第三步,因为写入范围属于容易被版本更新改动的部分。
常见问题
问:能不能设成只读,阻止程序写入? 答:会让保存操作直接失败,程序认为写规则是保存流程的一部分。更可行的做法是把运维条目挪到程序不触碰的位置。
问:为什么本地正常、线上会丢规则? 答:多数差异在环境判断。程序需要知道站点用哪种服务器与是否开启重写,判断条件不满足时就会走到整份生成的分支。
问:手工加的跳转被覆盖之后怎么快速恢复? 答:从备份还原,然后把跳转改到上层配置或后台提供的重定向入口里,避免再次落在被程序重写的那份文件上。