在Nginx中防止处理具有未定义服务器名称的请求和直接IP访问的请求,避免备案问题

  1. 如果有非备案的域名解析到了你已备案的IP上,而你的Web服务对该域名的请求有所响应的话,可能会导致IP被运营商封锁。nginx会将配置文件中没有配置的域名、IP指向到默认server中
  2. 当备案后的IP地址开启了形如 *.your-domain.com 的泛域名解析后,nginx 会将请求到这个IP地址的域名、IP都自动转到conf.d配置文件中的默认server中
  3. 参考nginx官方文章How nginx processes a request可以知道,如果 conf.d 目录下只有一个 .conf 的配置文件,则会读取该配置文件中出现的第一个 server 作为默认 server
  4. 当 conf.d 目录下有多个 .conf 配置文件的时候,nginx会按照字母顺序加载全部 .conf 配置文件,并且将加载的第一个配置文件中的第一个server作为默认server
  5. 为达到不处理nginx配置文件中没有配置的域名、IP请求的目的,需要增加以下 listen 80, listen 443 这2个 server,并且在 listen 后面增加 default_server 来显示指定该服务为 nginx 默认服务,配置文件如下
server {
    listen      80 default_server;
#    server_name ""; # Since version 0.8.48, this is the default setting for the server name, so the server_name "" can be omitted. In earlier versions, the machine’s hostname was used as a default server name.
    return      444;
}

server {
    listen              443 ssl default_server;
#    server_name         "";
    ssl_certificate     your_domain.com.pem; # 必须要设置一个证书,否则 nginx 会认为配置文件格式不正确,自签名的SSL证书也可以。
    ssl_certificate_key your_domain.com.key;
    return              444;
}
  1. 这里需要注意, nginx 从 0.8.48 开始就对 server_name 设置了默认值 “”,所以这里是可以不用配置 server_name 的。
  2. return 中 的 HTTP CODE 是 444 No Response 没有响应, 这个是由 nginx 自己定义的非标准HTTP状态码,在使用nginx的情况下,使用444状态码可以节省请求流量
  3. 在 listen 443 这个 server 中,必须指定SSL证书,否则 nginx 会认为配置文件格式错误

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注