上周给一个客户的WordPress站从虚拟主机迁到阿里云ECS,踩了几个坑。记下来免得下次再犯。
坑1:MySQL字符集不一致导致乱码
旧服务器MySQL是5.6,默认latin1。新服务器8.0,默认utf8mb4。用mysqldump导出再导入后,文章里的中文全部变成问号。
试了三种方案:改my.cnf、重新dump加--default-character-set、用iconv转。最后是这么搞定的:
① 导出时明确指定:mysqldump --default-character-set=latin1 -u root -p dbname > backup.sql
② 用sed把所有latin1替换成utf8mb4
③ 导入:mysql --default-character-set=utf8mb4 dbname < backup.sql
如果数据已经乱了,可以用这个SQL把乱码字段转回来:CONVERT(BINARY CONVERT(post_content USING latin1) USING utf8mb4)。亲测有效。
坑2:Nginx配置没改导致伪静态失效
旧服务器是Apache,伪静态靠.htaccess。迁到Nginx后所有文章页都404。
WP的Nginx伪静态规则网上到处都是,但这个站点装了WooCommerce和bbPress,默认规则会漏掉/product/和/forums/的路径。加了这两条location规则才恢复正常。
验证方法:curl -I https://域名/文章路径,返回200才算通过。别只看首页正常就觉得OK了,把所有类型的URL各抽几条测一遍。
坑3:PHP版本跳太快,一个老插件挂了
旧服务器PHP 7.2,新服务器直接上了8.2。站点里有一个2019年就停更的自定义字段插件,create_function()在PHP 8.0被移除了,导致后台白屏。
解决办法:进wp-content/plugins/找到那个插件,搜create_function,改成匿名函数。就改了两行代码,省了重新找替代插件的时间。
建议升级前先跑一遍PHP Compatibility Checker插件,把不兼容的列出来再迁移。
迁移检查清单
现在每次迁移我都按这个清单走,省了不少事:
1. 先在新服务器建个测试域名,hosts指向它,确认一切正常再切DNS
2. 导出数据库前关掉WP的缓存插件(W3 Total Cache之类),避免把缓存路径写死
3. 文件和数据库传完后,更新wp-config.php里的DB_HOST、DB_NAME
4. 更新wp_options表里的siteurl和home字段(如果用测试域名的话)
5. 从头到尾爬一遍站点,用Screaming Frog或者site:搜索,确认没有残留旧域名
6. SSL证书别忘了,用acme.sh自动续期的记得重新跑一下
这些都不是什么高深技术,但每个坑都够你折腾半天。
还木有评论哦,快来抢沙发吧~