WordPress 域名搬家

最近思考一个问题,我很多地方使用Shuspieler作为昵称,我的博客也是用的一级域名加上一个文件夹跳转的https://shuspieler.com/blog 。特殊情形可能还会用作域名邮箱比如,那么进行社会工程挖掘太容易就找到shuspieler.com站点了。虽然这个地方我没有想要做成私有,特地去隐藏,那样的话我也不会做公开站点,就像我在About Me 里记录的那样。只是想让一切随缘,就让这个站点独立存在这个互联网世界中,与我的真实身份没有关联。于是我想找个方法使我不隐藏这个博客地址的情况下,与真实身份剥离,给社会工程匹配增加一些难度。

于是我想将Blog与主页分离,使用blog.shuspieler.com二级域名,而在主页shuspieler.com放一个其他静态页面,比如写上我喜欢的话,或着美丽的诗词。这样当有人用昵称搜索进入主页shuspieler.com就可以欣赏一下我给他们摘抄的文摘,或者说是特殊情况通过邮箱后缀进来的也是同样效果,而对于blog.shuspieler.com这里就有了门槛,做到了一方面我不愿意私有化,又不愿意过度公开的需求。

之前wordpress搬过几次家,真的很麻烦,需要考虑的点实在太多了。今天我记录一下我这次本机搬家的过程吧,有可能自己未来还会用到,放在这里也可能会帮助到别人。

首先在DNS服务器添加blog到服务器IP的映射。

接下来的这个图是我之前的wordpress后台看到的地址,我放在了一个一级域名下的一个文件夹:http://shuspieler.com/blog 网站加密我是用Cloudflare实现的,所以这里是服务器http协议,这样的简化配置为搬家省了不少事情。

我需要搬到的地址为:http://blog.shuspieler.com ,服务器不变,只是换个域名映射。为了保险,我不是先做搬家,而是先复制一个一模一样的网站,当新的地址一切正常后,再将之前的删除。对于数据库,我也复制了一个一模一样内容的,新地址与新数据库连接,不去霍霍旧的数据。数据库搬家我用到了SQLyog这个软件,这个软件在多个MySQL服务器之间复制数据库特别好用,输入源地址目标地址,稍微点击几下,就能将整个数据库在两个MySQL服务器间实现复制。我是本地复制也是同样的道理,只是Connection是new,目标服务器和源服务器相同。由于里边信息太敏感了,好多东西都让我划掉了。但是真的对于简单整体数据库迁移这个工具很好用,推荐。唯一不足的是收费软件,但是有一定时间试用期,已经够用了。

对于新的数据库,建议单独设置一个用户,只对这个数据库有访问权限,以防黑客通过wordpress而越权看到其他数据库的信息。我没系统学习过MySQL,新用户设置用SQLyog毫无疑问也是可以实现,但是我习惯用phpmyadmin,我选择了和数据库名一样的用户名,然后在这里可以方便的对同同名数据库授予本数据库内的权限。同时这里主机名也选成localhost,只能本地连接,进一步降低潜在风险。

接下来的一步算是风险操作。但是有我们克隆了一个新的数据库,在新的里边尝试,如果有损坏的话,也还是有退路的。这里我们要更新路径,数据库之前记录的地址都需要更新成新的链接,我们在phpmyadmin通过SQL命令实现批量更换:

UPDATE wp_options SET option_value = replace(option_value, 'http://old.com', 'http://new.com') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = replace(guid, 'http://old.com','http://www.newurl');
UPDATE wp_posts SET post_content = replace(post_content, 'http://old.com', 'http://new.com');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://old.com','http://new.com');
UPDATE wp_usermeta SET meta_value = replace(meta_value, 'http://old.com', 'http://new.com');
UPDATE wp_comments SET comment_content = REPLACE (comment_content, 'http://old.com', 'http://new.com');
UPDATE wp_comments SET comment_author_url = REPLACE (comment_author_url, 'http://old.com','http://new.com');

其中http://old.com是老地址,是word press后台设置里边显示的地址,包括子文件夹,像我是这样的:http://shuspieler.com/blog 。然后http://new.com是新地址,对于我是:http://blog.shuspieler.com

现在数据库搬家完成了,下一步搬家服务器上网站数据。由于我在一个服务器上运行了多个网站,同时旧网站想先保留,万一复制的网站有问题,我还可以无痛退回来。多个域名解析到同一个服务器而实现一台主机服务多个网站,这个需要在Apache2做一些配置。有同样需求的同学,想在一个服务器跑多个网站的同学,可以搜索相应的帖子,这里暂时不做深入。简单来讲就是在 /etc/apache2/sites-enabled 生成一个新的配置文件,比如abc.conf,然后内容可以参考下边模板:

<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.

ServerName blog.shuspieler.com
#ServerAlias www.shuspieler.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/abc

# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error_abc.log
CustomLog ${APACHE_LOG_DIR}/access_abc.log combined

# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

其中ServerName 最重要,这个告诉Apache当通过哪个连接访问过来,我对应的网站是哪个存放在哪里。DocumentRoot是对应的文件夹,假设这里我放在/var/www/html/abc文件夹下,在abc文件夹中拷贝所有之前网站文件夹下的文件。这两个设置是最重要的,其他还有一些可以改的比如ServerAdmin,当网站出错可能这个消息会显示在访客浏览器中。还有ErrorLog,也可以根据需求设置。这里有一点需要注意,当复制网站文件时候,使用的登录服务器的账户与运行Apache的账户不一样的话,比如登录SSH进行复制使用user,而Apache使用的www-data用户,会造成新网站权限错误,简单的方法是可以将复制过去的文件拥有者换成www-data,或者是将复制过去的文件同时添加到www-data组,同时赋予文件在同组的用户也有相应权限:

假设存放新网站文件夹叫做abc,存放在/var/www/html/文件夹下,执行下边命令:

sudo chgrp -R www-data abc
sudo chmod -R g+r abc
sudo chmod -R g+w abc
sudo chmod -R g+x abc

第一个命令是改变所属于的组,-R是递归,将abc文件夹以及子文件中所有的文件改成归www-data组所有。第二第三第四赋予同组用户读取,写入以及执行的权限。g代表group,g+r就代表组添加read权限。

我在复制过程中,有几个文件夹复制失败,我看了下是文件属于root,我猜这应该是我个体原因,具体解决办法就不赘述。

下一步进行wordpress配置的更改,在新的网站文件夹下,打开wp-config.php,由于我们想用新的数据库,这几个地方应该改掉:

define( 'DB_NAME', '新数据库名' );
define( 'DB_USER', '新数据库用户名' );
define( 'DB_PASSWORD', '新数据库用户名的密码' );

我本地还有一些因为cache插件需要修改的设置,不是大众性的问题。应该不太重要,略过。

我本地还遇到所有跳转都失败的现象,因为我设置了permalink,这个需要服务器mod_rewrite模块的支持。如果有同学搬家前使用了permalink可能也会在这里有一些问题,可以看看.htaccess相关设置需不需要像我一样要有更新。

自此,全部搬家完成了。访问一下新的地址,见证一下奇迹吧:http://blog.shuspieler.com

其中肯定还有一些其他个性化问题,我没办法一一记录下来了。我这里遇到的比如说super cache问题导致网站首页一些缩略图缓存失败,还有遇到了权限问题,上边有简单介绍,还有permalink问题等等。

至此搬家完毕,不出意外的话,新的地址已经可以正常使用。同时设置里边已经是新的地址信息:

最后还有一个技巧。搬家之后,如果之前其他网站有过老域名的链接,比如https://shuspieler.com/blog/2033/ ,是其他网站转载或者推荐的链接,当老站删除后,这个地址也将失效。我解决这个的办法是在Cloudflare设置一个page rules,将旧的地址301永久跳转到新的地址如下图。这个图中有个错误,最上边那个原地址应该是shuspieler.com/blog/*,图中缺少一个*号。这会导致如果是更具体的链接地址的话会跳转失败比如https://shuspieler.com/blog/2033/ ,而加上*号,所有http://shuspieler.com/blog/ 下的链接,都会跳转到http://blog.shuspieler.com

自此所有操作完成。这篇记录,也是在新的地址下完成的。

如果有帮助到你的话,让我知道呀。

更新:

根据上边那种设置跳转,之前所有搜索引擎搜录的链接,以及其他网站的链接,都会跳转到https://blog.shuspieler.com主页,而不是对应的帖子页面,并不是很完美的解决方案。于是我觉得使用.htaccess实现所有旧链接到新链接的跳转。由于我之前使用的是子文件夹放的博客,所以这个.htaccess的语法我搞了好久,查了很多网页才弄好。

我是这样设置的,把cloudflare规则删掉,现在不需要cloudflare帮忙跳转了。在我的在旧blog子文件夹下的.htaccess更改为:

<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^shuspieler\.com$ [OR]
        RewriteCond %{HTTP_HOST} ^www.shuspieler\.com$ [NC]
        RewriteRule ^(.*)$ https://blog.shuspieler.com/$1 [R=301,L]
</IfModule>

这样类似于https://shuspieler.com/blog/2033/旧的比较具体的链接,就可以跳转到新的地址对应的帖子。但是还缺一点,缺shuspieler.com和www.shuspieler.com到新连接的跳转。和之前实现跳转到子文件夹类似,我用的是一个index.php 实现的301跳转,现在我的这个文件是这样:

<?php

        header('HTTP/1.1 301 Moved Permanently');
        Header( "Location: https://blog.shuspieler.com/" );
        exit();
?>

现在所有指向之前的连接,都可以跳转到正确的新地址。这个规则最好保持一段时间,最低1个月,给搜索引擎一个更新他们数据库的机会。

 

 

Reference:

https://www.wpzhiku.com/adding-custom-woocommerce-product-type/

https://blog.csdn.net/enweitech/article/details/48346323

https://www.zhiwaimao.com/wordpress-301-redirects/

http://www.ha97.com/2511.html

 

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.