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