nginx https配置问题

想实现禁止IP访问,http访问跳转https,功能已实现,但是有以下问题

  1. nginx -t 报 waring
  2. lissten 80 后面需要加default_server吗?
nginx: [warn] conflicting server name "_" on 0.0.0.0:80, ignored
server {
    listen  80;
    server_name _;
    return 500;
}

server {
    listen  80;
    server_name www.domain.com;
    rewrite ^(.*)$  https://$host$1 permanent;
}

server {
    listen       443 ssl;
    server_name  www.domain.com;
    # ssl 配置
    ssl on;
    ssl_certificate 1_.club_bundle.crt;
    ssl_certificate_key 2_.club.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
        root /www/blog;
        index index.html;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}
阅读 2.4k
2 个回答
  1. server_name_的这个server是处理请求头里Host字段为空的请求,一般会放在所有规则的最后面,最后被匹配。一般建议直接return 444;(Nginx非标返回码,意思是直接丢弃请求)。
  2. default_server一般的使用场景,是在多个Host规则都没匹配上时,显式指定一个默认规则适配给请求。如果不加default_server呢,那么默认会去匹配第一条规则,所以有时想直接把Host没匹配上任何规则的请求直接丢弃时,可以直接加到server_name_的那条server块里就行了。

报warning是因为定义了两个相同server(都监听80端口),且server_name定义为英文下划线代表允许所有ip或域名进行访问匹配,和www.domain.com重合了。
如果想禁止IP访问可以把第一个Server改成下面的形式

server {
        listen 80;
        server_name IP_ADDRESS;
        return 500;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题