0x01
很多人为了让HTTP跳转到HTTPS,往往都在对应的虚拟服务器conf文件上添加这样的一段配置:
server {
rewrite ^(.*)$ https://$host$1 permanent;
}
时间一长,网站、域名越来越多,重复的添加这个配置文件会导致配置文件的综合重复性增加。
为了减少配置文件的重复性,我们可以利用NGINX的DefaultServer特性来实现几行配置让全站HTTP ---> HTTPS的小技巧。
0x02
打开nginx.conf
,在HTTP字段下增加DefaultServer的配置:
server {
listen 80 default_server;
server_name _;
rewrite ^(.*)$ https://$host$1 permanent;
}
删除掉其他配置文件内的HTTP Server配置,只留下HTTPS,保存,重启Nginx
service nginx restart
0x03
实现原理
以a.web.com
为例,当用户访问80端口(HTTP)的a.web.com
时,利用NGINX的虚拟服务器匹配特性,由于a.web.com
的conf内只有443端口(HTTPS)的配置,匹配失败,转向寻找匹配nginx的预定义default_server
。
在default_server
中,由于我们已经提前定义了default_server
的行为,这个请求将会经过下面的处理:
- 解析用户的
$host
请求头。 - 重写用户URL为:https://a.web.com。
- 用户使用 https://a.web.com 重新访问NGINX。
- 由于a.web.com监听在443(HTTPS),命中配置,回传a.web.com的页面数据。
在这个配置下,无论用户采用什么域名访问HTTP端口,都会被这个配置改写为对应的HTTPS来重新访问NGINX,一劳永逸。
0x04
如果想要特定的服务器使用HTTP,只需要在配置文件配置HTTP端口即可,不配置默认将会被default_server
改写地址。
因为只有所有文件都匹配失败后,NGINX才会返回匹配default_server
。