这两天已经把我之前的一个网站整合了进来,做了一次两个 WordPress 的合并,所有的数据都保留下来了。数据搞定之后,很重要的一步就是设置旧域名向新域名的 301 跳转,否则之前旧站的访问量会全部丢失,也严重影响 SEO。

  我 VPS 上用的是 Nginx 服务器,接下来进行配置。开始之前,先补充点知识。

301 和 302 跳转的区别

301跳转:永久性转移(Permanently Moved)
302跳转:暂时性转移(Temporarily Moved)

共同点:二者都表示重定向,浏览器在获取服务器的返回码后会自动根据头部的Location值跳转到新的URL地址;
不同点:301表示旧地址被永久地移除了,已经不可访问;302表示旧地址还在,只是临时进行跳转,后续还是访问旧地址。

Nginx 设置旧域名301跳转到新域名

  Nginx 里的 rewrite 模块是专门负责静态重写的。基本用法是:rewrite patten replace flag。patten是正则表达式,与patten匹配的URL会被改写为replace,flag可选。例如将旧域名跳转到新域名上:

server
{
    listen 80;
    server_name www.old.com;
    rewrite ".*" https://ihacksoft.com;
}

如果是跳转到新域名上时要保留路径,那么:

server
{
    listen 80;
    server_name www.old.com;
    rewrite "^/(.*)$" https://ihacksoft.com/$1;
}

还有一种方式,如果域名不是 ihacksoft.com 就统一转到 https://ihacksoft.com:

server {
    listen 80;
    server_name ihacksoft.com ihacksoft.com ihacksoft.com www.ihacksoft.com ;
    if ($host != 'ihacksoft.com') {   
      rewrite ^/(.*)$ https://ihacksoft.com/$1 permanent;
    }
}

也可以单独增加一个 Server,在里面统一设置,permanent 是301跳转:

server {
    listen 80;
    server_name ihacksoft.com ihacksoft.com www.ihacksoft.com;
    rewrite ^/(.*)$ https://ihacksoft.com/$1 permanent;
}

rewrite 与 location 配合实现图片文件跳转到cdn:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
	 expires 30d;
	 rewrite "^/uploadfile\/(.*)$" https://cdn.ihacksoft.com/uploadfile/$1;
}

rewrite 正则表达式 替换目标 flag标记:

last – 基本上都用这个 Flag,相当于 Apache 里的 [L] 标记,表示完成 rewrite。
break – 中止Rewirte,不再匹配后面的规则。
redirect – 返回302临时重定向,地址栏会显示跳转后的地址。
permanent – 返回301永久重定向 地址栏会显示跳转后的地址。