前几天入了个Vultr的$2.5方案用来放这个博客,然后看着每个站点的配置里面都要写一个443端口和一个80端口共两个server{}段,其中80只是用来做301跳转,显得有点,不是那么完美。
出于对NGINX的不太熟练,我研究了一个下午,突然在蹲坑的时候灵机一动,就给解决了,为了不让这个灵机跟着米田共一起冲走,我还是记下来比较好。
上配置:
1 2 3 4 5 6 7 8 9 10 |
server { listen 80 default; listen [::]:80; server_name _; if ($host != $server_addr) { return 301 https://$host$request_uri; } root /usr/share/nginx/html; index index.html; } |
这是个默认站点(80 default)配置,访问IP和任何不存在的站点,NGINX都会转向这个默认站点。
这个配置解决了这么三个问题:
- 如果访问的是IP地址,那么作为默认站点,显示的是 /usr/share/nginx/html/index.html ,我的是 Hello, World!
- 如果访问的是任意HTTP站点,就会强制带参数301跳转到同域HTTPS站点上,而且是个万能跳转器,谁把域名做个CNAME到我的IP都会跳。
- 每个站点的配置文件,只需要写一段443的server{},不用额外写跳转的站点。
如果认为上面第2条看起来不太安全,或者不太爽,那也可以稍微改一下。
把配置里面的
1 |
if ($host != $server_addr) |
改成
1 |
if ($host ~* '域名1|域名2|域名3|域名4') |
Nginx就只会跳转到配置里面有的域名,没有的域名如果绑了你的IP,访问的是默认站点,不跳转。
BTW,
吐槽一下,Debian 8自带源也是不靠谱,默认编译的Nginx不带HTTP2,为了SSL Labs的A+评级,我只能用Nginx官方源的包……
1 2 3 4 5 |
/etc/apt/sources.list # Offcial Nginx Source deb http://nginx.org/packages/mainline/debian/ jessie nginx deb-src http://nginx.org/packages/mainline/debian/ jessie nginx |
-EOF-