nginx设置同一域名下网址的批量跳转




之前曾把 blog.wenjinyu.me 作为博客域名,后来由于需要申请google adsense,需要把www.wenjinyu.me作为博客域名,所以根域名设置了301跳转,在.conf中设置if语句即可。不过,在改变域名的同时,也有一大批网址需要更改,因为我把博客框架从wordpress换成了hexo,而且之前很多文章的网址直接用中文生成网址,看起来一团乱麻,现在改成了直观的英文网址,例如《win10简单脚本一步卸载Cortana》这篇文章,之前的网址是

1
https://blog.wenjinyu.me/win10%E5%85%B3%E9%97%ADcortana/

而现在是

1
https://www.wenjinyu.me/zh/an-easy-step-to-uninstall-cortana-in-win10/

所以网址的处理现在成了大问题。

在此必须说一句,频繁改网址对网站来说时大忌!刚建站的博主一定要重视网址,这是建站需要研究的基本功。

需要知道的一点是,改网址并没有那么简单,因为网址是别人找到你的网站的基本途径,经营了那么久好不容易把搜索排名挤上去,如果突然改掉网址,那么搜索引擎只会认为这个网站消失了,然后把更改后的网址作为一个新网站,说白了就是之前的努力都白费了,网站又要从头做起,所以才需要域名跳转。

我这次网址跳转最麻烦的地方就是需要跳转的网页数量太多了,直接写进.conf配置文件难管理且不美观,在网上找了一遍,教程基本都是首页跳转,或者域名跳转,但是对于网站内批量网址的跳转却很少见。后来发现,其实nginx里面的map指令就是专门用来做批量跳转的,只要加一个所有网址的跳转规则,然后在每个站点的配置文件加个引用规则的语句就行了。

配置nginx.conf

nginx的配置文件是/etc/nginx/nginx.conf/etc/nginx/conf.d/目录下的所有以.conf结尾的文件,原则上是可以把所有配置内容都写进nginx.conf这一个配置文件的,但是为了方便管理,我习惯把每个二级域名(例如wenjinyu.mewww.wenjinyu.me)的配置文件都写在各自的配置文件里,然后放到/etc/nginx/conf.d/目录下,通用的配置内容就放在/etc/nginx/nginx.conf,也建议每个新手都这么做,这样方便管理。

编辑配置文件:

1
vim /etc/nginx/nginx.conf

http域中添加以下内容:

1
2
3
map $request_uri $new {
include /etc/nginx/redirect.map;
}

添加完大概是这个样子:

1
2
3
4
5
6
7
8
9
10
...
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_max_body_size 100m;
map $request_uri $new { # 添加在这里
include /etc/nginx/redirect.map;
}
...
}

这样就会引用/etc/nginx/redirect.map作为映射规则文件。

添加映射规则

上面添加的配置内容已经提到,批量跳转的映射规则会放在/etc/nginx/redirect.map文件中,所以需要新建一个包含映射规则的redirect.map文件:

1
vim /etc/nginx/redirect.map

然后添加规则,规则的写法是:

~^ + 原地址 + 空格 + 新地址 + ;

注意:

例如原网址:https://blog.wenjinyu.me/win10%E5%85%B3%E9%97%ADcortana/

需要跳转到:https://www.wenjinyu.me/zh/an-easy-step-to-uninstall-cortana-in-win10/

则写入这样的规则

1
~^/win10%E5%85%B3%E9%97%ADcortana/ /zh/an-easy-step-to-uninstall-cortana-in-win10/;

添加跳转规则

有了映射规则,就需要在站点配置文件启用映射规则,之后原网址就会按照规则跳转

1
2
# 编辑配置文件
vim /etc/nginx/conf.d/配置文件.conf

添加跳转规则

1
2
3
if ($new){
return 301 https://www.wenjnyu.me$request_uri;
}

return 301是301永久跳转,也就是告诉搜索引擎:这个网址永久迁移到后面的新网址。

最后重启nginx即可。

1
systemctl restart nginx




评论