WiKiss 0.3 配置参数详解
WiKiss 0.3 唯一配置文件 _config.php 的 25 个变量参数全集:加载机制与覆盖优先级源码解析,鉴权/存储路径/时间本地化/界面文案逐组实测(含 Cookie 生命周期、LOCAL_HOUR 三处生效点、TIME_FORMAT 边界、备份开关),以及 opcache 延迟生效等排障实录。
WiKiss 0.3 配置参数详解
WiKiss 0.3 的全部配置收敛在站点根目录的一个 _config.php 文件里:出厂 25 个变量,没有任何数据库表、环境变量或后台设置页。本文以官方 0.3.tgz 发布包原文件为基准(与 《Ubuntu 22.04 安装 WiKiss 0.3 指南(PHP 8.1 兼容修复实录)》 实测环境逐字节 diff 一致),先讲清加载机制与覆盖优先级,再按「鉴权 → 存储路径 → 时间与本地化 → 站点标识 → 界面文案」逐组给出全部参数的实测行为——每个关键结论都有 HTTP 回显或落盘验证。页面保存、鉴权三通道与 Cookie 机制的完整行为在 《WiKiss 0.3 核心使用与鉴权配置详解》 中展开,语法层面对参数的依赖(如 $LANG 决定维基百科链接语言)见 《WiKiss 0.3 页面语法与常用操作详解》。
一、配置文件与加载机制
1.1 文件形态与出厂值
_config.php 就是一个普通 PHP 文件,WiKiss 启动时直接 include。出厂文件(0.3.tgz 原样,25 个变量)节选:
<?php # coding: utf-8
// Configuration du mot de passe
$PASSWORD = "test";
// Paramètres divers
$LANG = "fr";
$TIME_FORMAT = "%Y/%m/%d %R";
$LOCAL_HOUR = "0";
$PAGES_DIR = "pages/";
$BACKUP_DIR = "historique/"; //historique/
// Variables de configuration de langues
$WIKI_TITLE = "WiKiss : le Wiki Kiss";
$START_PAGE = "Accueil";
...(界面文案变量 14 个,见第二节总表)
$ERASE_COOKIE = "Eff. cookie";
?>
一个需要纠偏的事实:官方发布包的 $PASSWORD 出厂值是 "test",不是空字符串(本文实测环境与原始发布包 diff 无差异)——很多资料(含本文姊妹安装篇初稿)写成"默认为空即匿名可编辑",那是更早的 TigerWiki 或其他分支的口径。装完 0.3 若不改配置,用 test 就能编辑全站,等于半个匿名模式。
1.2 加载顺序与覆盖优先级
index.php 的加载顺序决定了哪些变量能通过配置覆盖(源码行号实测核对):
- 第 5 行:
$WIKI_VERSION = "WiKiss 0.3";——在 include 之前赋值; - 第 13 行:
include("_config.php");——配置文件整体加载,此后同名变量以配置为准; - 第 57 行以后:内部变量初始化
$toc、$plugins_dir、$plugins、$template、$PAGE_TITLE_link、$editable等——在 include 之后赋值。
由此得出两条覆盖规则:
$WIKI_VERSION可以被配置覆盖(它在 include 前定义)。实测在_config.php的?>前追加$WIKI_VERSION = "WiKiss 0.3-custom";并重启 Apache,页脚渲染为Wiki utilisant <a href="http://wikiss.tuxfamily.org/">WiKiss 0.3-custom</a>——多实例区分环境时有用,无功能影响;$template、$PAGE_TITLE_link、$editable、$plugins_dir、$plugins等内部变量在配置之后赋值,写了也会被覆盖,通过_config.php修改它们不生效——改模板请直接编辑template.html,换插件目录请保持plugins/名不变(或改源码第 58 行)。
1.3 修改配置的正确姿势与 opcache 时效
cd /var/www/wikiss
sudo cp _config.php _config.php.orig # 改前留底
sudoedit _config.php
php -l _config.php # 语法校验,防白屏
sudo systemctl reload apache2 # 建议重启/重载
其中 systemctl reload apache2 不是可选步骤:实测环境 PHP 8.1 的 opcache 配置为 opcache.revalidate_freq = 2(每 2 秒才检查一次脚本更新),本次实验中曾出现"改完配置立即请求仍走旧值"的延迟生效——一个典型实证是把 $BACKUP_DIR 置空后 3 秒内保存页面,备份文件仍然写出来了;将配置修改动作与 Apache 重启绑定后,行为与源码逻辑完全一致。生产环境把"改配置"和"重启 Web 服务"当成一个原子操作,可以规避这类难排查的玄学。
另外 _config.php 里存着全站编辑口令,权限建议收紧为 640、属主 www-data(Web 进程要读,其他系统用户不必读)。
二、配置参数总表(25 个)
按出厂文件顺序分组列出,"生效位置"栏标注实测/源码核对的触发点:
| 变量 | 出厂值 | 作用与生效位置 |
|---|---|---|
$PASSWORD | "test" | 全站编辑口令;保存校验 + Cookie 种子(第三节实测) |
$LANG | "fr" | <html lang> 属性、[?词条] 维基百科链接语言、RSS <language> 标签(第五节实测) |
$TIME_FORMAT | "%Y/%m/%d %R" | strftime 格式;最近更改列表与 RSS 条目描述(第五节实测,注意页面顶栏不受它控制) |
$LOCAL_HOUR | "0" | 时区偏移小时数;页面顶栏时间、备份文件名、页脚日期、最近更改时间四处(第五节实测) |
$PAGES_DIR | "pages/" | 页面存储目录,路径拼接用(第四节) |
$BACKUP_DIR | "historique/" | 历史备份目录,置空关闭备份(第四节实测) |
$WIKI_TITLE | "WiKiss : le Wiki Kiss" | 浏览器标题、RSS 频道标题与描述(第六节实测) |
$START_PAGE | "Accueil" | 首页页面名;?page= 省略时的默认页(第六节实测) |
$HOME_BUTTON | "Accueil" | 导航"首页"按钮文字(第六节实测) |
$HELP_BUTTON | "Aide" | 编辑表单里"帮助"链接的文字与目标页(第六节实测) |
$DEFAULT_CONTENT | "La page %page% est vide." | 新页面占位文本,%page% 替换为页面名(第六节实测) |
$EDIT_BUTTON | "Éditer" | 页面右上"编辑"按钮文字 |
$DONE_BUTTON | "Enregistrer" | 编辑表单"保存"按钮文字 |
$PROTECTED_BUTTON | "Page verrouillée" | 页面文件只读时的锁定提示(第六节 chmod 实测) |
$SEARCH_BUTTON | "Rechercher" | 搜索框提交按钮文字(accesskey="q") |
$SEARCH_RESULTS | "Résultats de recherche pour" | 搜索结果页标题前缀(?action=search 时拼在关键词前) |
$LIST | "Liste des pages" | 页面列表标题(搜索未填关键词时也落到列表页) |
$RECENT_CHANGES | "Changements récents" | 最近更改页标题与导航链接文字 |
$LAST_CHANGES | "Dernière modification" | 页面顶栏"最后修改于"前缀文字 |
$HISTORY_BUTTON | "Historique" | 编辑页"历史"链接文字 |
$NO_HISTORY | "Aucun historique existant." | 无备份时历史页的空态文案(语法篇改名反例实测出现过) |
$RESTORE | "Restaurer" | 历史页"恢复"链接文字 |
$MDP | "Mot de passe" | 编辑表单口令输入框的提示文字 |
$ERROR | $MDP." spécifié incorrect." | 口令错误提示(&error=1 时渲染进 {ERROR} 占位符) |
$ERASE_COOKIE | "Eff. cookie" | 已登录时页脚"清除 Cookie"链接文字(第三节实测) |
前三组(鉴权/存储/时间本地化)行为复杂、值得逐个实测;后三组多为纯文案替换,掌握生效位置即可按需本地化。
三、鉴权参数:$PASSWORD
0.3 没有用户体系,$PASSWORD 一个字符串就是全部鉴权。判定逻辑(authentified(),index.php 第 18-33 行)实测矩阵(设 $PASSWORD = "q1w2e3r4"):
| 请求 | 实测结果 |
|---|---|
POST 保存,sc=WRONG | 302 → ./?page=AuthTest&action=edit&error=1,文件不落盘 |
POST 保存,sc=(空) | 302 → &error=1,文件不落盘 |
POST 保存,sc=q1w2e3r4 | 302 → ./?page=AuthTest,落盘,同时下发展示 Cookie |
已持正确 Cookie,POST 不带 sc | 302 → ./?page=AuthTest,保存成功 |
| 持旧口令的 Cookie(改口令前签发) | 302 → &error=1——改口令即全员强制重新登录 |
口令正确时的响应头实测(Cookie 值就是口令的 md5,有效期一年):
Location: ./?page=AuthTest
Set-Cookie: AutorisationWiKiss=c62d929e7b7e7b6165923a5dfc60cb56; expires=Sat, 30-Oct-2027 06:54:17 GMT; Max-Age=31536000
三个安全相关推论(全部可从上表与机制推出):md5("q1w2e3r4") = c62d929e7b7e7b6165923a5dfc60cb56,拿到 Cookie 等于拿到口令,生产必须走 HTTPS;$PASSWORD 为空串时 authentified() 恒真(匿名可写模式);改口令后所有旧 Cookie 立即失效(md5 不匹配),这是 0.3 里唯一"踢人"手段。
已登录后页脚出现清除入口,实测渲染:
<a href="./?page=BackupOff&erasecookie=1" rel="nofollow">Eff. cookie</a>
点击访问 &erasecookie=1 后 Cookie 被置空、该链接实测消失——对应 $ERASE_COOKIE 只管这行文字,逻辑固定。
四、存储路径参数:$PAGES_DIR 与 $BACKUP_DIR
4.1 $PAGES_DIR:页面目录
所有页面读写、页面列表、最近更改都按 $PAGES_DIR . $PAGE_TITLE . ".txt" 拼接(index.php 第 161、205、320 行等十几处)。两个注意点:
- 尾斜杠必须保留:拼接是纯字符串连接,写成
"pages"会生成pages页面名.txt这类错误路径,页面系统整体错乱; - 换目录(如
pages2/)等于"换库"——原pages/全部页面从站点消失,且不会迁移。做页面目录级备份(整目录 tar)时记得连同historique/一起。
4.2 $BACKUP_DIR:历史备份开关与目录
保存路径源码里 if ($BACKUP_DIR <> '') 才写备份——置空字符串即关闭备份。干净环境实测(隔离重测,Apache 重启后):
# $BACKUP_DIR = "" 时保存页面
POST / → 302 ./?page=BackupOff(保存成功)
ls historique/BackupOff/ → 目录无新文件(备份未写)
# 恢复 $BACKUP_DIR = "historique/" 后再次保存
ls historique/BackupOff/ → 20261030-0704.bak(备份恢复)
备份文件格式实测(同分钟内的多次保存会 append 进同一个 .bak):
// 2026/10/30 06:54 / 172.17.0.1
no backup test
// 2026/10/30 06:54 / 172.17.0.1
backup on again
首行是 $LOCAL_HOUR 校正过的日期时间 + 编辑者 IP,后接当次保存的完整内容。两个运维结论:备份关闭只是"不再新增",historique/ 里已有的 .bak 仍然可用于恢复(历史回填机制见使用篇);备份文件名按分钟粒度生成(date("Ymd-Hi", mktime(date("H") + $LOCAL_HOUR))),同一分钟内反复编辑会合并进一个文件。
五、时间与本地化参数
5.1 $LOCAL_HOUR:时区偏移(中国填 8)
一个数字在四处生效,全部实测(容器系统时区为 UTC,$LOCAL_HOUR 从 0 改为 8,宿主机当时 14:53):
| 生效点 | LOCAL_HOUR=0 | LOCAL_HOUR=8 |
|---|---|---|
| 页面顶栏"最后修改" | 2026/10/30 06:53 | 2026/10/30 14:53 |
| 页脚日期 | 2026/10/30 06:53 -- | 2026/10/30 14:53 -- |
| 新备份文件名 | 20261030-0653.bak | 20261030-1453.bak |
| 最近更改列表时间 | 2026/10/30 06:53 | (同规则 +8h) |
顶栏时间实测渲染 Dernière modification : 2026/10/30 14:53——即 filemtime() + $LOCAL_HOUR*3600。对中文部署:系统时区保持 UTC、$LOCAL_HOUR = "8",显示时间即北京时间;反之系统时区设为 Asia/Shanghai 时这里要填 0,两边只能选一头,填重了时间会飘 8 小时。
5.2 $TIME_FORMAT:strftime 格式(生效范围有限)
改为 "%Y-%m-%d %H:%M" 后实测:最近更改列表变为 LocalHourTest</a> (2026-10-30 06:53 - <a href="./?page=LocalHourTest&action=diff">diff</a>),而页面顶栏的"最后修改"仍是 2026/10/30 06:53——顶栏用的是硬编码 date("Y/m/d H:i"),不受 $TIME_FORMAT 控制。该参数实际只作用于最近更改列表(strftime)与 RSS 条目描述两处,想统一全站时间样式是做不到的,这是 0.3 的硬编码局限。RSS 条目的 pubDate 还有一层:date("r", mtime) 原样输出服务器时间戳,同样不带 $LOCAL_HOUR 偏移。
5.3 $LANG:不是"语言包"开关
0.3 没有语言包加载机制,界面上所有法语词都来自 _config.php 的那些文案变量本身——把界面变中文的方式是逐个改写文案变量,$LANG 本身只在三处生效(全部实测):
1. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> ($LANG="en" 实测)
2. <a href="http://en.wikipedia.org/wiki/Wiki" class="url" title="Wikipedia">Wiki</a> ([?Wiki] 链接,fr 时为 fr.wikipedia.org)
3. RSS 频道 <language>fr</language> (wkp_Rss 模板占位符替换)
设 $LANG = "zh" 可让 [?词条] 指向中文维基百科,<html lang> 也随之正确,但界面文案不会跟着变——那 14 个文案变量才是"界面语言"。
六、站点标识与界面文案参数
6.1 $WIKI_TITLE 与 $START_PAGE / $HOME_BUTTON
改 $WIKI_TITLE = "WiKiss 0.3 实验站" 实测:浏览器标题 <title>WiKiss 0.3 实验站 - Accueil</title> 立即生效;但访问 /rss.xml 频道标题仍是旧值——RSS 是静态文件:wkp_Rss 插件在每次保存页面时重写根目录 rss.xml(源码注释原文"Fichier généré: rss.xml à la racine du wiki",实测文件 mtime 与最后一次保存时刻一致),纯改配置不会触发再生,下次任何人保存页面后 RSS 标题才更新。这也是排障点:改了站名却发现 RSS 订阅里还是旧名字,存一次任意页面即可。
$START_PAGE 决定不带参数访问 / 时渲染哪个页面,实测改为 沙盒页面(同时 $HOME_BUTTON = "首页"):
<title>WiKiss : le Wiki Kiss - 沙盒页面</title>
<h1><a href="./?page=%E6%B2%99%E7%9B%92%E9%A1%B5%E9%9D%A2">沙盒页面</a></h1>
导航区:首页 / <a href="./?action=recent" accesskey="3">Changements récents</a>
注意最后一行:当前页就是首页时,"首页"是纯文本而非链接(源码判断 $PAGE_TITLE == $START_PAGE 时直接输出 $HOME_BUTTON 文本);在其他页面时才是 <a href="./?page=Accueil" accesskey="1">Accueil</a> 链接形态。$START_PAGE 支持任意已有页面名(含中文,实测通过)。
6.2 $DEFAULT_CONTENT:新页面占位文本
访问不存在的页面时渲染的占位文本,%page% 实测替换为页面名。改为 "页面 %page% 尚未创建,点击「保存」即创建该页面。" 后访问 ?page=NewPage001:
页面 NewPage001 尚未创建,点击「保存」即创建该页面。
中文站必改项——出厂值是法语"La page %page% est vide."。这段文字会预填进编辑框(编辑不存在的页面时 textarea 里就是它),保存前记得清掉或直接在其上写正文。
6.3 按钮与锁定文案:$EDIT_BUTTON / $DONE_BUTTON / $PROTECTED_BUTTON
$EDIT_BUTTON(默认"Éditer")是页面右上编辑链接的文字;$DONE_BUTTON("Enregistrer")是编辑表单提交按钮。$PROTECTED_BUTTON 的触发条件实测:把页面文件对 Web 运行用户改为只读(chmod 444 pages/TestS9.txt),该页右上角按钮文字从"Éditer"变为 Page verrouillée(源码 is_writable() 判断),恢复 664 后按钮实测回归——这就是语法篇页面锁定操作的配置面。三个文案都支持中文与空格,直接改写即可。
6.4 $HELP_BUTTON 与 $MDP / $ERROR
$HELP_BUTTON(默认"Aide")比较特殊:实测它只在编辑表单区域渲染为帮助链接(<a href="./?page=Aide" accesskey="2">),浏览态的模板里 {(HELP)} 占位符被整体移除——既是链接文字又是目标页面名,指向一张不存在的页面时编辑表单里会出现 pending 红链。
$MDP("Mot de passe")是编辑表单口令框提示文字;$ERROR 出厂值是 $MDP." spécifié incorrect."——拼接表达式,跟随 $MDP 的取值,口令错误时(URL 带 &error=1)渲染进模板 {ERROR} 占位符。本地化时若单独改写 $ERROR,记得它默认引用 $MDP,两者顺序在配置文件里不能颠倒($ERROR 在 $MDP 之后定义)。
七、搜索与历史相关文案参数
$SEARCH_BUTTON("Rechercher"):搜索框提交按钮,实测带accesskey="q"快捷键;$SEARCH_RESULTS("Résultats de recherche pour"):搜索结果页标题前缀,实测?action=search&query=Aide时页面标题为Résultats de recherche pour Aide(前缀 + 空格 + 关键词);$LIST("Liste des pages"):全站页面列表的标题文字(搜索动作未带关键词时也会落到列表页);$RECENT_CHANGES("Changements récents"):最近更改页标题与导航链接文字;$LAST_CHANGES("Dernière modification"):页面顶栏前缀文字;$HISTORY_BUTTON("Historique"):编辑页历史链接文字;$NO_HISTORY:历史页空态文案(语法篇改名漏改historique/目录时实测出现过);$RESTORE("Restaurer"):历史版本"恢复"链接文字。
这组变量在保存路径上只有 $SEARCH_RESULTS 参与业务逻辑(拼进 $PAGE_TITLE),其余是纯展示文案,误改不会破坏功能、最多影响可读性。
八、FAQ 与排障
Q:改了 _config.php 没生效? 先 php -l _config.php 确认语法;再确认走了 Apache 重启/重载——opcache 的 revalidate_freq=2 窗口内请求会拿到旧值(本文 1.3 节有备份开关延迟生效的实证)。仍不生效的变量逐一核对 1.2 节覆盖规则($template 等内部变量改了也白改)。
Q:改完配置整站 500 / 白屏? _config.php 是被 include 的 PHP,语法错全站崩。php -l 预检 + 保留 _config.php.orig 底稿,出事秒回滚。
Q:口令改了,别人还能编辑? 旧 Cookie 在新口令下 md5 不匹配,实测立即失效(第三节矩阵)——若还能编辑,检查是不是改的 _config.php.orig 或没重启 Apache。
Q:RSS 里的站名/内容不是最新? rss.xml 是保存页面时才重写的静态文件(6.1 节实测),改配置不会触发;存一次任意页面即可再生。
Q:时间显示差 8 小时? $LOCAL_HOUR 与系统时区重复叠加(5.1 节):系统是 UTC 就填 8,系统是 Asia/Shanghai 就填 0,只填一处。
Q:备份文件里同一个时间戳有两段内容? .bak 以 append 模式写,同一分钟内的多次保存合并进同一文件(4.2 节回显),内容按 // 日期 / IP 分段,不是文件损坏。
Q:想全站只读怎么办? 0.3 没有只读开关:$PASSWORD 设强口令防写(浏览永远匿名),再对特定页面 chmod 444 锁定(6.3 节);页面目录整体 555 可实现全站锁定,但编辑与备份会同时失效,仅作迁移/归档场景使用。