虚拟主机子目录建站方法:主站与测试站共存的路径配置

子目录建站解决什么问题:一套主机里跑两套站

[虚拟主机](https://cn.hostease.com/shared-hosting.html)子目录建站示意:一个主机账户内容纳主站目录与测试站子目录

这篇教程教你如何在已有的虚拟主机上,用 /test 这样的子目录把第二套站点挂在主站旁边:主站继续对外服务,测试站只在内部可见,两套程序各用各的数据库。改版验证、换主题试色、给客户做预览站,都不必再买主机,也不必动主站的插件和设置。真正动手时,卡住人的通常不是传文件,而是三个地方:主站根目录的重写规则会把子目录请求抢走,站点地址写错会让后台进不去,两套站共用一张表会把主站内容覆盖掉。下面按可照做的顺序展开,每步都给配置和验证方式。

预期先讲清楚:子目录方案适合两套站资源需求接近、由同一个人维护的场景。它省掉的是新主机和域名解析的麻烦,代价是路径里永远带着 /test,两套站共享同一账户的 CPU 与进程数。测试站要跑真实压测、或要给另一个客户独立使用,这个方案就不合适,文末给了替代路径。

三种共存方式先分清,子目录不是安全隔离

同一个主机账户里放两套站,常见做法有三种:子目录(https://example.com/test/)、子域名(https://test.example.com)、附加域名(把 brand.com 的文档根指向 /public_html/test)。三者底层的文件可以是同一份,区别只在访问入口和证书覆盖范围。子目录最省事:不用改 DNS(域名解析记录),不用申请新证书,装完就能访问;子域名介于两者之间,加一条解析即可;附加域名适合第二套站要有自己的品牌域名。

这里要先纠正一个常见误判:子目录不是沙箱。两套站运行在同一个系统用户下,测试站里一个带后门的插件,照样能读写主站的 wp-config.php。要真正的权限隔离,就得用独立账户或独立主机;子目录只解决“同一账户里放两套站”。

对比示意:左侧单域名下嵌套子目录,右侧域名下分出独立子域名节点

动手前的三项确认:文档根、数据库与配额

第一步不是传文件,而是看清主机环境。登录面板,确认站点文档根的实际路径(常见是 public_html,也有 httpdocs 或 www),确认可以新建数据库和数据库用户,再确认磁盘配额还剩多少。[共享主机](https://cn.hostease.com/shared-hosting.html)默认是 Apache 或 LiteSpeed,支持 .htaccess 目录级重写,能改到隐藏文件就够了。

配额这一步经常被跳过,后果很直接:主站占 12 GB、配额 20 GB,再复制一份 8 GB 的站进去,备份一跑就写满;磁盘写满后会话文件和日志也写不进去,表现就是“主站突然 500”。动手前算一遍:两站体积相加再乘以二(含一份备份),应该还不到配额八成。

步骤一:建目录、放程序、定权限

在文件管理器里,于文档根下新建 test 目录,把第二套程序解压进去。目录权限保持 755、文件保持 644,wp-config.php 可以收紧到 600。不要图省事改成 777——共享主机上一个 777 的目录,等于给同服务器上的其他账户留了写入口。

程序放好后先用一个静态文件验证目录能不能访问:在 test 下放 index.html,打开 https://example.com/test/ 应该直接看到它。这一步就 404,问题在目录归属、大小写或文档根,别急着装 WordPress,否则两个问题会混在一起。

步骤二:独立数据库与表前缀,避免两站互相覆盖

在面板里为测试站单独建库,例如 example_test,再建一个只对这个库有权限的用户。表前缀不要用默认的 wp_,改成 wp_test_。这不是洁癖,而是事故预防:同一个库里两套站写同一批 option 记录,主站首页设置、固定链接、插件配置会被测试站随手改写,出了问题连谁改的都查不出来。

套餐只给一个库时,表前缀必须不同,导出导入只碰自己前缀的表。这类操作可以参考站内 WP-CLI 与 phpMyAdmin 的实操流程 的导出、替换、回滚步骤,注意把库名和前缀换成测试站自己的。

数据库隔离示意:两台站点程序分别连接各自的数据库圆柱,中间有清晰分隔

步骤三:站点地址写对,后台才不会来回跳

WordPress 记录站点地址有两个值:程序地址和访客看到的站点根。子目录站两个值都要带上 /test,最稳是直接写进 wp-config.php,常量优先级高于数据库旧值:

define('WP_HOME', 'https://example.com/test');
define('WP_SITEURL', 'https://example.com/test');

只在数据库里改一半最危险:后台登录看起来成功,点一下菜单就跳回主站。这类“登录成功但进不去后台”的故障,九成是这两个值与数据库里的 siteurl、home 不一致。改完用无痕窗口重新登录确认。

还有一种拓扑容易搞混:WordPress 装在子目录、却让根域名显示这套站(根目录放 index.php 转发)。那是让一套站占两个地址,与“两个独立站共存”正好相反,规则别拼在一起。

步骤四:伪静态规则互抢请求,是最高频的坑

主站根目录的 .htaccess 里通常有固定链接规则,匹配范围覆盖整个目录树,于是 /test/wp-admin/ 这样的请求会先被主站规则捕获、转给主站 index.php,结果要么 404,要么看到主站首页。修复要两边同时做,先在主站根 .htaccess 里加排除条件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/test/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

再在 public_html/test/.htaccess 写子目录自己的规则,RewriteBase 必须是 /test/,最后一条规则的落点也要带子目录:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /test/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /test/index.php [L]
</IfModule>

只改一边不够:只排除主站规则,子目录固定链接会 404;只写子目录规则,主站规则仍然先抢走请求。改完清一次面板里的页面缓存,否则你会以为规则没生效,在同一个地方反复改。

请求分流示意:同一个入口的请求被分到主站目录与子目录两条路径

步骤五:让测试站不被搜索引擎抓到

最常见的错误是在 /test/ 下放一个 robots.txt 就以为万事大吉。搜索引擎只读取文档根目录的那一个,子目录里的会被忽略。有效手段是响应头或访问控制,两者可叠加:

<IfModule mod_headers.c>
Header set X-Robots-Tag "noindex, nofollow"
</IfModule>

更彻底的是加一层 HTTP 基本认证,未登录的访客连页面都拿不到。注意顺序:认证块放在重写规则之前,没通过认证的请求才会先被拦下。要把测试站临时给客户看,用认证比 noindex 靠谱——noindex 挡不住已被抓取的页面。

测试站立访问控制示意:访客被挡在门外,只有通过认证的才进入子目录容器

步骤六:证书、缓存与备份分开处理

证书这一项最省心:子目录站和主站同域,共用一张覆盖 example.com 的 SSL(安全传输协议)证书即可,不必为 /test/ 单独签发;只有把独立域名绑到这个目录,才需要给新域名配证书。完整的部署与“混合内容”告警排查,站内 HTTPS 部署与证书排查 讲得很细。

缓存不能共用一套目录。页面缓存的键里必须含主机名和路径,否则主站的缓存文件会被测试站请求命中,出现“访问 /test/ 却看到主站首页”。用缓存插件时确认缓存目录落在各自站点的 wp-content 下,别为了省空间指向同一路径。

备份也要分开做。整站备份会把子目录一起打包,体积翻倍,恢复时还容易把测试站的数据盖回主站。稳妥的方式是主站一份、测试站一份,或在备份规则里排除 /test/ 下的上传目录;全量与增量备份如何搭配 那篇的保留策略,套到双站场景就是把“两个站各留一份全量”写进规则。

验证:五条命令确认两站真的互不影响

配置完别只看首页能不能打开,按下面五条逐一验证,任何一条不对都说明隔离没做到位:

  1. 请求主站首页,确认返回 200 且没有跳转:curl -I https://example.com/
  2. 请求子目录首页,确认返回 200 且最终地址仍是 /test/:curl -I https://example.com/test/
  3. 请求子目录的 REST 接口,确认返回 JSON 而不是主站首页 HTML:curl -s https://example.com/test/wp-json/ | head -c 200
  4. 打开测试站任意一篇固定链接文章,确认地址栏保留 /test/ 前缀,图片地址也在 /test/wp-content/uploads/ 下
  5. 在测试站后台上传一张图片,再回主站媒体库确认看不到这张图

第三条最关键:wp-json 直接返回 JSON,说明请求确实进了子目录的 index.php;返回主站首页 HTML 就回去检查步骤四的排除条件。第五条查上传路径有没有跟着子目录走,有些一键迁移工具会把上传目录写成绝对路径,测试站的图片就存进了主站媒体库。

出问题时先查这四处

按故障现象对照,比从头读配置快:

  • 访问 /test/ 直接看到主站首页 —— 主站根 .htaccess 缺 !^/test/ 排除条件
  • 后台登录后跳回主站 —— WP_HOME、WP_SITEURL 与数据库 siteurl、home 不一致
  • 子目录文章全部 404 —— 子目录 RewriteBase 不是 /test/,或落点写成了 /index.php
  • 改动测试站却影响主站内容 —— 两套站共用同一个库且表前缀相同

四处都排除后还有一种情况:主机自带的安全插件把 /test/wp-admin 当可疑路径拦了。这类拦截返回 403 而不是 404,可在面板里给测试站目录加白名单,而不是关掉整站防护。

什么时候子目录不是好选择

子目录的前提是两套站资源需求接近、由同一人维护。这些情况换方案更划算:测试站要跑和主站完全不同的 PHP 版本或扩展;测试站需要做压测、会长时间占满 CPU;两个站分属不同客户,备份和权限责任要分开。共享主机的 CPU 与并发进程按账户计算,测试站跑一次全站抓取,主站访客就可能排队等进程。

需要独立资源时,站内 共享主机与独立服务器的选型判断 给了按流量规模和技术能力匹配的方法。判断标准简化成一句:只是改版验证、数据量小、访问量低,子目录够用;要独立 PHP 版本、独立 IP 或真实压力测试,就该换[独立服务器](https://cn.hostease.com/dedicated-server/),别在共享环境里硬扛。

落地建议:先把隔离做对,再谈性能

六步做完,你得到一个和主站互不干扰的第二站点:目录独立、数据库独立、伪静态规则互不抢请求、搜索引擎抓不到、备份不互相拖累。建议先在测试站上走完“换主题、发文章、传图片、恢复备份”四个动作,逐个确认没串到主站,再把改动搬到主站;零停机迁移与域名解析切换 可在推到独立域名时接着看。

Hostease 的虚拟主机面板允许同一账户下建多个子目录并各自建库,配额和进程按账户共享,小规模改版验证够用;要跑两个都有独立流量的站,建议拆到独立方案。推荐先把测试站锁在认证之后,验证通过再决定共用还是迁移。

发表评论