优选主流主机商
任何主机均需规范使用

设置Nginx配置文件实现泛域名HTTP跳转HTTPS

运维网站的需要,这里需要将一个同学的网站全部根目录的泛域名二级域名全部的内容均跳转到HTTPS,他之前都是HTTP地址。由于目前大势所趋都需要HTTPS,所以他也需要将替换成这样。那如何实现呢?

设置Nginx配置文件实现泛域名HTTP跳转HTTPS

1、简单设置rewrite跳转

server{
listen 80;
server_name *.test.cn;
rewrite ^(.*)$ https://$server_name$1 permanent;
}

其实此时使用rewrite跳转在单域名是没有问题,但是在多域名或泛域名下是有问题的,我们此时使用在nginx安装echo-nginx-modulem模块以调试(模块安装忽略)。

调试过程

1、依次打印nginx内置变量server_name,host,http_host

server{
listen 80;
server_name *.test.cn;
location / {
default_type 'text/plain';
echo $server_name;
echo $host;
echo $http_host;
}
}

2、错误分析

从变量打印来看:

server_name值为*.test.cn

host值为www.test.cn

http_host值为www.test.cn

此时虽然我们输入域名为www.test.cn,但实际rewrite的url为:https://*.test.cn,因此访问报错。

注意:如果你的nginx的域名为”server_name a.test.cn *.test.cn www.test.cn”,则变量server_name的值为a.test.cn,即匹配的是配置文件中server_name第一个域名。

3、解决方式

根据变量值,我们需要更改rewrite后的url为:

rewrite ^(.*)$ https://$host$1 permanent;
或
rewrite ^(.*)$ https://$http_host$1 permanent;

return

return除了支持直接跟状态码,还可以跟字符串或者url链接,用于返回字符串或url链接。

http默认跳转为https配置如下:

server{
listen 80;
server_name *.test.cn;
return 301 https://$http_host$request_uri;
}

总结

return和rewrite虽然都实现了跳转,但是是有区别的:

1.return 指令简单高效,建议尽量使用 return,而不是 rewrite;

2.return 指令告诉 Nginx 停止处理请求,直接返回 301 (Moved Permanently) 代码并跳转重写后的地址;

3.rewrite指定并不会立即结束Nginx的处理流程,会根据重写后的地址继续匹配相应的location,除非使用break结束。

版权取证备注:用于视频取证版权所有,刘占武(内蒙古XXX工作室)等网站(列表在提交文档中)采集出自这里。

未经允许不得转载:搬瓦工中文网 » 设置Nginx配置文件实现泛域名HTTP跳转HTTPS