You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress多站点被迫使用子域名问题求助

解决已有WordPress站点转子目录多站点的痛点方案

你遇到的这个警告其实是WordPress的安全提示:因为你的主站点已经运行了5年,有大量现有内容,直接启用子目录多站点会导致主站点的根路径内容(比如mysite.co.uk/my-old-post)和新子站点的路径(比如mysite.co.uk/new-site)冲突,轻则404,重则内容错乱。但既然你只能用子目录模式,我们可以通过以下步骤安全过渡,把对现有链接的影响降到最低:

第一步:先做全量备份!(没商量的第一步)

  • 把整个网站的文件(包括wp-content、根目录的所有配置文件)打包下载到本地
  • 用phpMyAdmin或者备份插件导出完整的数据库
  • 有条件的话,先在 staging 测试环境复刻一遍操作,确认没问题再碰生产环境

第二步:给主站点内容加个专属前缀

为了避免主站点内容和子站点路径打架,我们得给主站点的所有文章、页面加个统一前缀,比如/blog或者/main(选一个符合你业务的就行)。这样主站点的旧内容会变成mysite.co.uk/blog/my-old-post,子站点就可以用mysite.co.uk/store、mysite.co.uk/forum这类路径,完全不冲突。

  • 登录主站点后台,去设置 > 固定链接
  • 选择「自定义结构」,在你原来的固定链接结构前加上前缀,比如原来的是/%postname%/,改成/blog/%postname%/
  • 点击保存,WordPress会自动更新.htaccess规则(如果没自动更新,后面我们手动处理)

第三步:启用多站点功能

  • 打开根目录的wp-config.php文件,找到/* That's all, stop editing! Happy publishing. */这行,在它上面添加这段代码:
/* 启用多站点模式 */
define( 'WP_ALLOW_MULTISITE', true );
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false ); // 强制开启子目录模式
define( 'DOMAIN_CURRENT_SITE', 'mysite.co.uk' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
  • 保存文件后刷新后台,你会发现侧边栏多了「工具 > 网络设置」的选项

第四步:配置网络规则和.htaccess

  • 进入「工具 > 网络设置」,填好网络标题和管理员邮箱,点击「安装」
  • 安装完成后,WordPress会给出新的wp-config.php和.htaccess代码,注意:
    • wp-config.php里我们已经加了核心的多站点定义,只需要补充缺失的(比如define( 'SUNRISE', 'on' );这类)
    • .htaccess要替换成多站点专用规则,记得把下面的blog换成你刚才设置的主站点前缀:
      RewriteEngine On
      RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
      RewriteBase /
      RewriteRule ^index\.php$ - [L]
      
      # 主站点前缀匹配规则
      RewriteRule ^blog/([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
      RewriteRule ^blog/([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
      
      # 多站点通用路由规则
      RewriteCond %{REQUEST_FILENAME} -f [OR]
      RewriteCond %{REQUEST_FILENAME} -d
      RewriteRule ^ - [L]
      RewriteRule ^blog/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
      RewriteRule ^blog/([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
      RewriteRule . index.php [L]
      

第五步:加301重定向,保住旧链接的SEO和访问

原来的用户都是通过mysite.co.uk/my-old-post访问的,现在路径变了,必须加301重定向把旧链接跳转到新链接,不然会丢流量和SEO权重:

  • 在.htaccess的最顶部添加这段规则(同样把blog换成你的前缀):
# 重定向旧根路径内容到新前缀路径
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_URI} !^/wp-admin/
RewriteCond %{REQUEST_URI} !^/wp-content/
RewriteCond %{REQUEST_URI} !^/wp-includes/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /blog/$1 [R=301,L]
  • 这条规则会自动把所有非后台、非静态文件的旧链接,跳转到带前缀的新链接,用户和搜索引擎完全感知不到变化

第六步:全面测试,确保万无一失

  • 随便找几个主站点的旧链接访问,确认是否自动跳转到新的带前缀链接
  • 创建一个测试子站点(比如mysite.co.uk/test-site),检查子站点能不能正常打开、后台能不能操作
  • 检查主站点的文章、页面、媒体文件是否都能正常加载
  • 如果用了CDN或者缓存插件,一定要清空缓存,让新的规则生效

额外注意点

  • 如果你的.htaccess原来有自定义规则(比如缓存、安全规则),别直接覆盖,把多站点规则和原有规则合并起来
  • 如果发现媒体文件链接不对,可能需要批量替换数据库里的旧路径,执行SQL语句(记得替换表前缀wp_为你实际的前缀):
    UPDATE wp_posts SET guid = REPLACE(guid, 'mysite.co.uk/', 'mysite.co.uk/blog/');
    UPDATE wp_posts SET post_content = REPLACE(post_content, 'mysite.co.uk/', 'mysite.co.uk/blog/');
    
  • 操作完成后,建议用站长工具检查一下网站的链接状态,确保没有404错误

内容的提问来源于stack exchange,提问作者iwillbeawebdeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:33:57