苦逼前端

nginx配置小结

Nodejs2017-11-10 17:28

刚开始配置多个server的时候,发现一个奇怪的现象,比如有两个域名a.com和b.com,将监听a.com的server注释掉,居然还能访问到a.com,并且是b.com的内容...

到nginx官方查阅文档才了解到default server的概念,如果请求头中的host没有匹配到任何的server name,nginx就会将这个请求发送到这个端口的default server上,这个default server默认是配置文件中的第一个server,也可以通过以下方式来指定:

server {
    listen 80 default_server;
    server_name  example.com www.example.com
}
# 0.8.21前:listen 80 default;

这也就解释清楚了我遇到的那个「奇怪的现象」,但是怎么才能阻止这个现象的发生呢,官网也给出了解决方案:

server {
    listen 80 default_server;
    server_name "";
    return 444;
}

这样所有流经80端口的请求,未匹配到server_name的都会跑到这里,被返回一个444的状态码并关闭。

后来启用https后,想把https使用的443端口也加上这个默认配置:

server {
    listen 443 ssl default_server;
    server_name "";
    return 444;
}

发现并不起作用,原因是没有配置ssl_certificate和ssl_certificate_key:

server {
    listen 443 ssl default_server;
    server_name "";
    ssl_certificate /position/of/ssl_certificate;
    ssl_certificate_key /position/of/ssl_certificate_key;
    return 444;
}

然后看了看certbot自动配置的https监听,发现用了这种手段来实现http转https:

if ($scheme != "https") {
    return 301 https://$host$request_uri;
} # managed by Certbot

这么做怕是每一个请求都需要经过这个判断吧,于是果断自己改成了:

server {
    listen 80;
    server_name xwenliang.cn;
    return 301 https://xwenliang.cn$request_uri;
}
评论(0)
  • 暂无评论,求挽尊...
还可输入200个字