旧域名过期了,怎么把WordPress博客手动搬到新服务器?

前言

如果把域名过期时间搞忘了,想再给域名续期,却发现域名已经被抢注了,这时候应该怎么办呢?当然是申请一个新域名重新绑定啦,正好之前在 VMRack 搞活动的时候抢了一台价格很便宜的2C4G云服务器,用了大半年了感觉很稳定,索性旧趁这个时机,给博客也顺便换一个服务器。

本来想着跟上次迁移博客时,在旧服务器下载 1Panel 备份的系统快照,再到新服务器的 1Panel 还原就行了,结果搞了大半天总是不行,干脆就手动迁移算了,在这个过程中踩过了不少坑,所以想着记录下来,给大家分享手动迁移WordPress博客的这些经验教训。

我的环境先交代一下:

  • 旧服务器:Ubuntu 22.04、1Panel、MySQL 8.4.5、memcached 1.6.22、OpenResty、PHP 8.4.6、WordPress 7.1.2,证书已过期、域名已过期;
  • 新服务器:Debian 12、1Panel,新域名。

如果想要从零搭建WordPress博客,可参考我之前写过一篇《WordPress博客全流程搭建》,可以看一下,对于文章后面的内容会有更多的理解。

开始之前

正式动手前,三件事必须先确认:

  1. 新域名已经解析到新服务器:去域名管理里加一条A记录指向新服务器的公网IP,ping一下能通再开始。解析没生效,后面申请证书、访问站点全是白忙;
  2. 把旧站的环境版本记下来:PHP、MySQL这些版本号后面搭新环境要用,先抄下来放手边。

第一步:在旧服务器上"抢救"数据

这是最紧迫的一步,必须在旧服务器到期前完成。因为旧域名过期,WordPress后台的导出功能用不了,所以只能走1Panel直接备份。

操作:在旧服务器的1Panel里,分别对网站文件和数据库做备份,然后下载到本地。

备份mysql数据库
备份WordPress网站文件

特别注意:

  1. 网站文件在网站根目录下的wordpress文件夹里,wp-config.php、wp-content都在里面,备份这个文件夹就够了;
  2. 下载数据库.sql文件时,务必确认文件完整、大小正常。这是博客全部文章、页面、评论和设置的核心数据,丢了就真的没了。

顺带一提,如果不想在正式迁移前冒险,也可以先把这套备份搬到本地电脑练一遍手,小龙虾博客有一篇《WordPress迁移Win10本地测试教程》讲的就是这个,练熟了再上新服务器,心里有底很多。

第二步:在新服务器上搭好"空壳"环境

新服务器是Debian系统,先在1Panel里把WordPress的运行环境建好。

操作:在1Panel应用商店先安装OpenResty、MySQL和PHP,然后在OpenResty创建一个新网站,在运行环境里选择安装的PHP,绑定新域名。此时网站目录是空的,就是个"空壳"。

版本选择上有个原则:PHP版本对齐旧站,其余用最新。

  • OpenResty、MySQL直接用最新版,没有历史包袱;
  • PHP选和旧站一致的8.4。PHP大版本之间会有函数弃用和扩展变动,主题和插件都是围着某个版本写的,8.4升8.5这种小版本一般没事,但从7.x直接跳到8.x,老主题白屏、插件报错都是常事。迁移本身就够多变量了,PHP版本这个变量能锁死就锁死。
安装wordpress扩展的PHP
openresty创建网站

还有一个容易漏的:我旧站装了memcached 做对象缓存,如果旧站也用了这类缓存(memcached或Redis),新服务器要把对应的服务和PHP扩展一起装上,不然迁移完以后台报错、页面变慢的方式提醒你它的存在。

特别注意:新服务器上MySQL的root密码、新建数据库的密码,全部记下来,后面改wp-config.php要用。也可以和旧数据库保持一致,省得改的时候多想一步。

第三步:把数据和文件装进新家

旧服务器的"灵魂"(数据库)和"肉体"(网站文件)都备齐了,现在把这些文件打包上传到新服务器中,解压缩后,准备导入工作。

操作:

  1. 在1Panel里新建一个数据库,然后用数据库页面的"导入备份"功能,把旧的.sql文件导进去;
  2. 把解压缩后的旧服务器的wordpress文件夹内容复制到到新网站的根目录,确保index.php这些文件直接躺在根目录下,不要多套一层文件夹。
导入mysql数据库

特别注意:这是最容易出错的环节。导入数据库报错的话,优先检查字符集——1Panel建库时选utf8mb4、排序规则utf8mb4_general_ci,和旧站保持一致。不确定旧站用什么,可以打开导出的.sql文件看头部几行,里面写的有。

第四步:先把安全插件"冻"起来

如果WordPress博客装过安全类插件(Wordfence这类),导入完先别急着访问网站,最好全部屏蔽掉——这类插件会拦截请求、写死旧路径,不清掉它们,新站可能连页面都打不开,还会干扰后面的排错。

操作:进入wordpress/wp-content/plugins文件夹,把里面所有插件文件夹重命名,加个后缀。比如经典的安全插件Wordfence,文件夹名改成wordfence-disable就行。

WordPress是靠文件夹名识别插件的,改了名它就找不到了,等于手动停用。这一步是可逆的,后面会改回来。

第五步:让WordPress认识新域名(最关键)

域名换了,必须让WordPress知道自己的新地址。后台进不去,所以只能直接改文件和数据库。

1.改 wp-config.php

打开新网站根目录的wp-config.php,把数据库连接信息改成新服务器的:

PHP
define('DB_NAME', '新数据库名');
define('DB_USER', '新数据库用户名');
define('DB_PASSWORD', '新数据库密码');
define('DB_HOST', 'mysql容器名');

特别注意:DB_HOST填的是MySQL容器名。1Panel是用Docker跑MySQL的,网站环境和数据库各自在容器里,容器之间靠容器名互相访问,填错容器名称就会连不上——这是1Panel新手最常见的连库失败原因。容器名在1Panel的容器页面能看到。

然后在文件里加两行强制代码,让网站先跑起来:

PHP
define('WP_HOME', 'https://新域名');
define('WP_SITEURL', 'https://新域名');

这两行的优先级高于数据库里的地址设置,属于硬编码覆盖,加上之后立刻就能访问首页和后台了。正因为它硬,所以只是临时手段,后面就要删掉。新站如果已经配好SSL就写https://,还没配就先http://。

2.改数据库里的 siteurl 和 home

后台登不进去的时候,可以用phpMyAdmin,或者1Panel数据库页面的SQL终端入口,进入博客的数据库,把wp_options表里的两个字段改成新域名:

SQL
UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name = 'home'; 

特别注意:

  • 改完这两处,应该就能正常登录https://新域名/wp-admin了。此时网站后台可用,但文章里的图片和链接还是旧域名,这是正常的,之后再处理;
  • wp_options表的前缀不一定叫wp_,先执行show tables;看一眼实际的表名,别对着不存在的表敲命令。

第六步:批量替换正文里的旧域名

这是"焕然一新"的最后一步。文章正文、图片地址、插件设置里散落着旧域名,必须批量替换,否则图片会裂、内链会死。

推荐操作:登录后台后,安装Better Search Replace插件,然后在"工具"菜单里进入插件界面,选中所有数据表,搜索填旧域名(如https://旧域名.com),替换填新域名,先勾选"Run as dry run"预演一遍,确认替换数量符合预期,再正式执行。

Better Search Replace插件

特别注意,很重要的一条:不要直接用SQL语句去替换。

WordPress数据库里存着大量"序列化数据"——比如插件设置、小工具配置。这类数据是PHP序列化后的字符串,里面带着内容长度标记,直接REPLACE把内容改了、长度标记没跟着改,反序列化就会失败,轻则插件设置错乱,重则后台白屏。Better Search Replace这类工具会先反序列化、再替换、再重新序列化,能安全处理这类数据。

除了替换旧域名以外,博客里其他要批量替换的文本也可以用这个插件,不过部分数据改起来不太听话,最后还是得自己去找到它的位置手动改。

替换完内容后,去"设置 → 固定链接"页面,什么都不用改,直接点一次"保存更改"。这个动作会刷新伪静态规则——迁移和插件折腾过后,重写规则经常处于旧状态,不刷新的话文章页容易404。

第七步:收尾排雷

大件都搬完了,剩下的是零碎但容易翻车的收尾。

1. 删掉 wp-config.php 里的强制代码

等后台的常规设置里地址正常显示、网站运行稳定后,把第五步加的那两行define('WP_HOME'...)删掉。不删的话,后台"常规设置"里的地址栏会一直是灰色,以后想改域名就不方便了。

2. 后台报 HTTP ERROR 500?查安全插件残留

访问后台提示"HTTP ERROR 500",除了数据库连接失败,最大的嫌疑就是安全插件残留。比如网站日志里出现这种:

PHP Fatal error: Failed opening required '/www/sites/旧域名/index/wordpress/wordfence-waf.php' 

原因是Wordfence的WAF靠auto_prepend_file这个PHP配置,在每次PHP请求前自动加载它的防火墙文件,而这个路径写死了旧服务器的旧域名目录,新服务器上根本没这个文件,于是每次请求都加载失败、直接Fatal。

排查这三处,看有没有旧域名和wordfence的踪迹:

  • php.ini里的auto_prepend_file;
  • 网站根目录的.user.ini;
  • 网站配置文件或.htaccess。

解决办法:把相关行删除或注释掉,再把网站根目录下的wordfence-waf.php和.user.ini改名(加.bak后缀),保存后重启OpenResty和PHP。

特别注意:.user.ini的生效有延迟,改完别急着验证——php-fpm对它有缓存,默认300秒(5分钟)左右才刷新,等一会儿再看。

3. 确认登录地址

WordPress默认登录页是https://域名/wp-login.php,或者https://域名/wp-admin/。如果之前用插件改过登录地址,默认入口会被屏蔽,把那个插件先按阶段四的方法屏蔽掉,就能正常访问了。

4. 重新申请SSL证书

在新服务器上给新域名申请Let’s Encrypt证书,续签是全自动的,以后不用手动操心。证书验证方式的区别和选择,可以参考我之前写过的一篇《SSL证书验证全攻略:DNS/HTTP/手动解析怎么选?》。

5. 插件清空重装

所有旧插件在后台全部停用,然后回到plugins文件夹把第四步改名的插件改回来,再进后台把旧插件全部卸载,最后按需重新安装插件。旧服务器上装过的插件鱼龙混杂,借搬家机会清一遍,新站干净很多。

6. 不要急着删旧服务器

新站跑通、文章图片正常显示、检查无误之后,再释放旧服务器。

7. 备份新站

迁移完成,在1Panel里对新网站和新数据库做一次完整备份,给这次搬家画上句号。

搬完之后的检查清单

我搬完是照着这个单子挨个点了一遍,建议大家也过一遍:

  • 首页正常打开,样式没有乱;
  • 随机点几篇文章,正文、图片、内链都正常;
  • 图片右键检查一下地址,确认是新域名;
  • 后台能登录,能正常发文章、传图;
  • 评论提交一次,确认能收到;
  • 站内搜索跑一次;
  • 手机端打开看一眼,主题的移动端样式没崩。

总结

整个手动迁移的流程如下:

  1. 旧服务器备份网站文件和数据库;
  2. 新服务器装环境建空站(PHP版本对齐);
  3. 建库导入+文件上传
  4. 重命名冻结安全插件
  5. 改wp-config.php连接信息+加两行强制地址
  6. SQL改siteurl和home
  7. Better Search Replace批量替换旧域名,固定链接保存刷新
  8. 删除强制代码、排查500错误、申请证书、清理插件
  9. 对着检查清单过一遍网站
  10. 备份收工。

这就是我的整个WordPress博客迁移流程,因为每个人的博客环境都不一样,本文内容仅作参考,如果大家有其他的问题或者建议,欢迎在评论区探讨!

希望这篇文章能够帮助到你!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇