0%

在Nginx上为http,Https启用301重定向

301重定向

Nginx几种常见实现301重定向方法上的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Nginx下常见的301跳转有以下三种,虽然都能达到同样的目的。但是三种写法上还是有区别的,主要的区别是在正则匹配的性能上。

第一种

使用rewrite指令,通过正则匹配所有的URI后再去掉开头第一个/(反斜线)。

/etc/nginx/conf.d/www.example.com.conf
1
rewrite ^/(.*)$ https://www.zxavier.com/$1;

第二种

同样使用rewrite指令,不同的是通过$request_uri变量匹配所有的URI。

/etc/nginx/conf.d/www.example.com.conf
1
rewrite ^ https://www.zxavier.com$request_uri? permanent;

这样写的好处是省去了去掉开头第一个反斜线的过程,正则匹配上性能更优。

第三种

使用return指令,通过301状态码和$request_uri参数,直接告诉Nginx这是个301重定向和抓取指定URI。

/etc/nginx/conf.d/www.example.com.conf
1
return 301 https://www.zxavier.com$request_uri;

通过以上三种写法介绍,我们可以看出return指令在301跳转上比rewrite指令性能上更加有优势。虽然在访问量不大的情况下几种写法的性能表现上区别并不大,不过在海量访问中一个小小的优化也能在提升业务系统性能上起到不小的作用。

下面就以第三种方法给网站进行重定向
为了实现http://zxavier.comhttp://www.zxavier.comhttps://zxavier.com用301重定向https://www.zxavier.com查了很多资料,终于摸索出了方案,下面是我conf的配置代码。

/etc/nginx/conf.d/www.example.com.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server {
listen 80;
server_name zxavier.com www.zxavier.com;
return 301 https://www.zxavier.com$request_uri;
}
server {
listen 443;
ssl_certificate /etc/letsencrypt/live/zxavier.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/zxavier.com/privkey.pem;
server_name zxavier.com;
return 301 https://www.zxavier.com$request_uri;
}
server {
listen 443 default_server ssl http2;
listen [::]:443 default_server ssl http2;
server_name www.zxavier.com;

root /var/www/hexo;
index index.html index.htm;

ssl on;
ssl_certificate /etc/letsencrypt/live/zxavier.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/zxavier.com/privkey.pem;

location / {
try_files $uri $uri/ =404;
}
}

然后用站长工具 HTTP状态查询 检查下http状态,可以看到状态码都是301了,所有http和不带www的域名都301重定向到了带www的https链接。
大家使用Qualys SSL Labs安全测试对自己的网站进行检测,也可以看到状态码。