请求 /?author=1,响应 302,Location 指向 /author/admin/。把数字从 1 试到 20,能拿到全部后台账号的登录名。乍看像缓存或者权限的锅,追下去往往不是。

if ($arg_author) {
    return 404;
}
# 或改作者别名
wp user update admin --user_nicename=editor-01

追下去是这么回事:author 查询参数会按用户 ID 查作者页,作者页 slug 默认就是登录名。这个跳转是核心逻辑,不装插件也能被脚本逐个试出来。

「author 参数枚举」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,先确认作者页是否要保留,不需要就在主题里把 author 模板关掉;需要保留就改 author base,别让 slug 等于 user_login;nginx 层直接拦带 author 参数的请求,统一返回 404。

验收就看一点,再访问 /?author=1 返回 404,/author/admin/ 也打不开。

作者 9823189