Nginx泛域名http默认跳转https

Posted 木讷大叔爱运维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx泛域名http默认跳转https相关的知识,希望对你有一定的参考价值。





读完需   分钟




基于全球的网络安全,现在浏览器基本都将默认的HTTP站点标识为不安全,很多站点都将HTTP网站添加SSL证书,切换至HTTPS加密协议。

nginx作为高性能的HTTP和反向代理web服务,一般作为服务入口提供负载均衡和流量分发,因此我们在Nginx上添加SSL证书,实现HTTPS访问;同时为保证用户无感知,需要配置HTTP默认跳转HTTPS。

下面我们来解析下泛域名下的http默认跳转https。

rewrite跳转

我们一般使用rewrite进行重定向,如下:

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

此时浏览器访问报错:

Nginx泛域名http默认跳转https

其实此时使用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; }}

浏览器访问:

Nginx泛域名http默认跳转https

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;

扩展

如果使用Nginx+Lua,你会发现在整个Nginx的访问流程中,return指令处于rewrite阶段,而rewrite指令处于access阶段,因此return的优先级是高于ngx_limit_req访问频率限制的。







以上是关于Nginx泛域名http默认跳转https的主要内容,如果未能解决你的问题,请参考以下文章

nginx泛域名解析实现二级域名多域名

Nginx多个域名,https redirect to http

为二级域名注册ssl证书,并强制使用https对http进行跳转

nginx http301强制跳转https域名跳转到带www

Nginx 配置 https 后,http 强制跳转到 https,主域名跳转至带 www 的二级域名

Nginx配置HTTP强制跳转到HTTPS