博客更换域名后利用Nginx实现完美301跳转
说起博客网站更换域名来,可以说很多站长们几乎都很少碰到过,但是随着博客网站的发展,更换域名是个不可避免的事儿,所以了解和学习好域名更换要注意的事项也是很有必要的。最近明月就遇到这样的事儿了,更换为新的域名后在301 跳转这里卡壳了,折腾了近三天才算是彻底的搞定,今天就将明月自己的这些经历为基础给大家仔细的讲解和分享一下,也当做明月自己折腾服务器的一次学习笔记。域名 301 跳转的原理
301 跳转是指页面永久性移走,又叫 301 重定向,是一种非常重要的“自动转向”技术,是网址重定向最为可行的一种办法。当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的 HTTP 数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
301 跳转主要职能“域名转向”
路由选择的变化也是对数据报文经由路径的一种重定向。在我们网站建设中,时常会遇到需要网页重定向的情况:像网站调整,改变了网站的目录结构,网页被移到一个新地址。或者网页扩展名改变,如因应用需要把.php 改成.html 或.shtml,在这些情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个 404 页面错误信息,访问流量白白丧失。又比如某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等等。
常用的重定向方式
301 重定向:301 代表永久性转移(Permanently Moved),301 重定向是网页更改地址后对搜索引擎最友好的方法,只要不是暂时搬移的情况,都建议使用 301 来做转址。
302 重定向:302 代表暂时性转移(Temporarily Moved ),在前些年,不少 Black Hat SEO 曾广泛应用这项技术作弊。各大主要搜索引擎均加强了打击力度,像 Google 对 BMW 德国网站的惩罚。即使网站客观上不是 spam,也很容易被搜寻引擎误判为 spam 而遭到惩罚。
301 重定向的意义
网站改版完成,先将新版上线,在线上保持一段时间新旧内容共存。新旧内容同时存在一段时间,且新版内容已开始收录后,对新旧内容设置 301 跳转,将旧版内容指向新版对应内容。
301 重定向有利于网站首选域的确定,对于同一资源页面多条路径的 301 重定向有助于 URL 权重的集中。按照上述操作方式在现有情况下能够尽可能的降低网站因改版带来的流量损失,提高用户体验度,同时有利于网站优化。
明月更换域名的经历心得
言归正传,明月自己的这次域名更换其实也不复杂,就是将现有的博客域名(lnmp.ymanz.com,已经启用 SSL 加密协议的)替换为全新申请备案的独立域名(www.imydl.tech,同样启用了 SSL 加密协议的),刚开始明月使用的是 CloudXNS 域名解析平台提供的 301 跳转来实现重定向的,Nginx 里只有 imydl.tech 跳转到 www.imydl.tech 的(301 重定向)配置,测试后发现只有老域名不是 SSL 加密的 https 协议时候才能实现 301 跳转 ,也就是说必须是 http://lnmp.ymanz.com 这样的老域名链接才会被 301 跳转到新域名 https://www.imydl.tech 这很不科学呀!有没有!没有办法了,为了尽快在百度站长平台提交“网站改版”就只能暂时在百度站长平台里取消 https 了(HTTPS 退场),这样至少可以保证百度在“网站改版”的时候可以接受新旧域名更换的改版规则进入索引库域名更改阶段。
第二天继续折腾上述 301 重定向中存在的问题,仔细的分析了一下我感觉上述的问题应该是 CloudXNS 解析里的 301 跳转造成的,也就是说 DNS 解析里的 301 跳转回存在“兼容性”的问题,比如这个 https 的跳转就无法通过 DNS 解析的 301 来实现,毕竟 https 是需要SSL 证书验证这个环节的,DNS 解析里就没有这个东西,当然就会出错了!看来要实现完美的 301 跳转必须还是得在 Nginx 里想办法了,无论是百度还是谷歌发现都是 Nginx 里有关 http 跳转到 https 的,几乎没有一个像明月这样的应用场景的。没有办法只能在知乎和思否上求助高手了,最后还是思否上一个大咖给出的办法完美的实现了,下面明月就贴出相关的 Nginx 配置文件供大家学习参考:
首先需要部署好新旧域名的解析和 Nginx 里的配置,具体要求如下:
取消 CloudXNS 里的 301 跳转解析,老域名一律指向新域名服务器 IP。
所有的 301 重定向跳转一律在 Nginx 里设置实现。
无论新旧域名都需要有有效的 SSL 证书并且在 Nginx 里的指定好证书的绝对路径,保证 Nginx 可以找到使用。
老域名独立的段定义要存在于新域名的 Nginx 配置文件里
server
{
listen 443 ssl http2;
server_name www.imydl.tech;
server_tokens off;
……
}
此处省略新域名的具体配置,节省篇幅嘛
下面是老域名的定义
server
{
listen 80; #监听 80 端口,保证`http://老域名`这样的形式可以被识别并 301 跳转到新域名。
listen 443 ssl;#监听 443 端口,保证`https://老域名`这样的形式可以被识别并 301 跳转到新域名。
server_name lnmp.ymanz.com;
#这里声明的 SSL 证书就是为了保证`https://老域名`这样的形式可以被识别并 301 跳转到新域名。
ssl_certificate //ssl/lnmp.ymanz.com.cer;
ssl_certificate_key //ssl/lnmp.ymanz.com.key;
#这里通过条件判断凡事 http 前缀开头的老域名请求一律 301 跳转到新域名。
if ( $scheme = "http" ) {
return 301 https://www.imydl.tech$request_uri;
}
#替换老域名链接为新域名链接,比如:https://lnmp.ymanz.com/123.html 替换为 https://www.imydl.tech/123.html
#完全自动化的智能链接重写替换,访问这几乎是感觉不到的实现 301 跳转,这里主要是针对文章、页面等各类老域名链接网址的。
location / {
rewrite ^(.*)$ https://www.imydl.tech$1 permanent;
}
}
如果你要使用上述的配置,请记得替换相关信息为自己的域名哦!
完成后保存退出,重启 Nginx 生效。因为修改了解析里的老域名解析,所以受制于解析生效时间,这个 301 跳转实现可能会存在一定的延时,耐心等待解析全网生效即可。
通过 curl 在命令行里验证 301 跳转是否生效
curl -I https://lnmp.ymanz.com
当看到如下输出信息时即表明 301 跳转已经实现了!
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 12 Feb 2018 05:51:28 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://www.imydl.tech/
注意查看第一行的 HTTP/1.1 301 Moved Permanently 即表明这个请求被 301 重定向了。最后一行的 Location 显示的是重定向后的网址。
我们再测试一下文章或者页面链接是否也可以 301 跳转
curl -I https://lnmp.ymanz.com/cross.html
输出结果:
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 12 Feb 2018 05:53:54 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://www.imydl.tech/cross.html
可以看到最后一行的 Location 显示的是重定向后的网址为 https://www.imydl.tech/cross.html,正好是新域名对应的链接。完美实现了 301 跳转。
新老域名更换 301 跳转的重要意义
通过上述的验证后,大家应该就理解了新老域名更换后 301 跳转重定向的重要意义,总结下来就是老域名的外链资源不会浪费都被永久的强制 301 重定向到了新域名下,这对新域名快速获得老域名的收录和权重都有很大的帮助,就是告诉搜索引擎这两个域名都是一样的内容只是域名进行了更换,这样无论是搜索引擎里是否提供了更换域名的服务,随着时间的推移,慢慢的搜索引擎就会将老域名都指向新域名,这样更换域名造成的 SEO 方面的损失就会讲到最低。
最后再强调一下,这个 301 跳转重定向建议大家长期保存直至新域名的流量和搜索权重恢复到老域名同等水平的时候再取消,明月是建议大家长期保留的,如果老域名本是是 SSL 加密协议的 https 的话,记得要及时更新 SSL 证书确认为都是最新有效期的证书即可(专指Let's Encrypt 证书一类)。
页:
[1]