文章插图
基于全球的网络安全,现在浏览器基本都将默认的HTTP站点标识为不安全,很多站点都将HTTP网站添加SSL证书,切换至HTTPS加密协议 。
Nginx作为高性能的HTTP和反向代理web服务,一般作为服务入口提供负载均衡和流量分发,因此我们在Nginx上添加SSL证书,实现HTTPS访问;同时为保证用户无感知,需要配置HTTP默认跳转HTTPS 。
【Nginx泛域名http默认跳转https】下面我们来解析下泛域名下的http默认跳转https 。
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;
returnreturn除了支持直接跟状态码,还可以跟字符串或者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结束 。
扩展如果使用Nginx+Lua,你会发现在整个Nginx的访问流程中,return指令处于rewrite阶段,而rewrite指令处于access阶段,因此return的优先级是高于ngx_limit_req访问频率限制的 。
推荐阅读
- nginx反向代理导致session失效的问题处理
- Nginx高性能优化配置实战总结
- SSL泛域名证书?免费生成!
- Nginx 极简教程,常用场景统统解析
- 淘宝网开设店铺的一般步骤 淘宝店铺域名是什么意思
- 淘宝直通车属于哪种推广模式 淘宝直通车精准推广还是广泛推广好
- 性能提升9倍的 nginx 线程池,你了解多少?
- 茶壶变黄了怎么办,茶叶汤色常见不足泛红
- 淘宝域名怎么填写 淘宝域名设置在哪里
- Nginx在高并发下的性能优化点!有这篇就够了