隔离
Rudel 是一个由请求选择的覆盖层系统。选中的请求会使用沙盒数据库表和沙盒主题文件,同时仍通过主机的 WordPress 安装运行。
每个沙盒独立隔离
WordPress 数据表
每个沙盒都会获得一个生成的表前缀:主机前缀加上沙盒 ID 的 MD5 开头七个十六进制字符。
wp_b65338d_options
wp_b65338d_posts
wp_b65338d_users
Rudel 会在 WordPress 完成启动前切换 WordPress 表前缀,因此沙盒请求中的每个查询都会读取和写入沙盒副本。
用户
users 和 usermeta 数据表会与其余数据表一同克隆。沙盒创建时会包含主机上的用户和密码;之后,在沙盒中创建、修改或删除用户都不会影响主机,主机上的变更也不会同步到沙盒。
当前主题文件
所选主题会复制到沙盒目录:
wp-content/rudel-environments/{environment_id}/themes/{theme_slug}
如果该主题是子主题,Rudel 也会复制父主题,以保持模板关系有效。沙盒始终提供创建时记录的主题;在沙盒中切换主题不会产生影响。
与主机共享
- WordPress 核心
- 插件文件
- 上传的媒体文件
在主机上安装或更新的插件也会为每个沙盒安装或更新。哪些插件处于启用状态存储在选项表中,因此各沙盒的启用状态彼此独立。在沙盒中上传的文件会存入主机的上传目录。这样可以加快沙盒创建速度,并避免全局替换 WP_CONTENT_DIR。
请确保 Rudel 在每个沙盒中始终处于启用状态。邮件阻止和主题覆盖功能由该插件运行;如果在选中沙盒时将其停用,还会从共享的 wp-config.php 中移除引导行,从而关闭整个安装中的沙盒选择(问题 #13)。
选择沙盒
HTTP 请求通过以下方式选择沙盒:
X-Rudel-Environment标头(旧版别名X-Rudel-Sandbox)rudel_environmentCookie(旧版别名rudel_sandbox)
Rudel 不会设置或清除 Cookie。删除 Cookie 即可返回主机;管理栏中的 Sandbox 项会链接到主机 URL,但会保留该 Cookie(问题 #10)。
WP-CLI 命令通过以下方式选择沙盒:
RUDEL_ENVIRONMENT环境变量- 主机名以沙盒 ID 开头的
--url,例如--url=http://alpha-3be7.example.test
选择器未经身份验证。任何能够访问站点并发送有效沙盒 ID 的客户端都能进入该沙盒,而沙盒 ID(名称加四个十六进制字符)很容易猜到。不要将沙盒选择视为访问控制边界;应在 Web 服务器或网络层面保护公共主机。
请求默认行为
对于选中的请求,Rudel 会:
- 通过
pre_wp_mail过滤器阻止出站邮件 - 将
WP_TEMP_DIR设置为沙盒的tmp目录 - 将
WP_CACHE_KEY_SALT设置为沙盒专属值,使持久对象缓存中的键彼此隔离 - 为沙盒
debug.log提供WP_DEBUG日志,以及根据沙盒 ID 派生的身份验证密钥和盐
仅当 wp-config.php 尚未定义这些常量时,引导程序才会逐一定义它们。标准 wp-config.php 会定义 WP_DEBUG 以及所有密钥和盐,因此在此类安装上,沙盒请求会使用主机的调试设置、密钥和盐(问题 #4)。由于用户也会被克隆,主机登录 Cookie 在沙盒中可能有效。
运行时元数据
Rudel 运行时元数据保存在主机 WordPress 的 MySQL 数据表中:
wp_rudel_environments
wp_rudel_worktrees
这些数据表是 Rudel 的权威数据源。环境目录包含受管理的文件和构件,不包含运行时注册表状态。