42 Nginx的server_name匹配执行顺序

42 Nginx的server_name匹配执行顺序

42.1 匹配执行顺序

由于server_name指令支持通配符和正则表达式,因此在包含多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配成功,当遇到这种情况,当前请求交给谁来处理呢?

[root@nginx-100 /usr/local/nginx/conf]# cat nginx.conf
user www;
worker_processes 2;
error_log logs/error.log;
pid logs/nginx.pid;
#daemon on; # 默认on

events {
    accept_mutex on;
    multi_accept on;
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  text/plain;

    sendfile        on;
    keepalive_timeout  65;
    
    server {
      listen 80;
      server_name ~^www\.\w+\.com$;
     
      return 200 'regex_success'; # 正则匹配成功
    }
    server {
      listen 80;
      server_name www.itheima.*;
       
      return 200 'wildcard_after_success'; # 通配符在后匹配成功      
    }
    server {
      listen 80;
      server_name *.itheima.com;
      
      return 200 'wildcard_before_success'; # 通配符在前匹配成功     
    }
    server {
      listen 80;
      server_name www.itheima.com;
 
      return 200 'exact_success'; # 精确匹配成功
    }
    server {
      listen 80;
      server_name _;
 
      return 444 'default_server not found server!!!';
    }
}



[root@nginx-100 /usr/local/nginx/conf]# nginx -t && nginx -s reload
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

浏览器访问:http://www.itheima.com/

image

[root@nginx-100 /usr/local/nginx/conf]# cat nginx.conf
user www;
worker_processes 2;
error_log logs/error.log;
pid logs/nginx.pid;
#daemon on; # 默认on

events {
    accept_mutex on;
    multi_accept on;
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  text/plain;

    sendfile        on;
    keepalive_timeout  65;
    
    server {
      listen 80;
      server_name ~^www\.\w+\.com$;
     
      return 200 'regex_success'; # 正则匹配成功
    }
    server {
      listen 80;
      server_name www.itheima.*;
       
      return 200 'wildcard_after_success'; # 通配符在后匹配成功      
    }
    server {
      listen 80;
      server_name *.itheima.com;
      
      return 200 'wildcard_before_success'; # 通配符在前匹配成功     
    }
   # server {
   #   listen 80;
   #   server_name www.itheima.com;
 
   #   return 200 'exact_success'; # 精确匹配成功
   # }
    server {
      listen 80;
      server_name _;
 
      return 444 'default_server not found server!!!';
    }
}
[root@nginx-100 /usr/local/nginx/conf]# nginx -t && nginx -s reload
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
View Code

浏览器访问:http://www.itheima.com/

image

[root@nginx-100 /usr/local/nginx/conf]# cat nginx.conf
user www;
worker_processes 2;
error_log logs/error.log;
pid logs/nginx.pid;
#daemon on; # 默认on

events {
    accept_mutex on;
    multi_accept on;
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  text/plain;

    sendfile        on;
    keepalive_timeout  65;
    
    server {
      listen 80;
      server_name ~^www\.\w+\.com$;
     
      return 200 'regex_success'; # 正则匹配成功
    }
    server {
      listen 80;
      server_name www.itheima.*;
       
      return 200 'wildcard_after_success'; # 通配符在后匹配成功      
    }
   # server {
   #   listen 80;
   #   server_name *.itheima.com;
   #   
   #   return 200 'wildcard_before_success'; # 通配符在前匹配成功     
   # }
   # server {
   #   listen 80;
   #   server_name www.itheima.com;
 
   #   return 200 'exact_success'; # 精确匹配成功
   # }
    server {
      listen 80;
      server_name _;
 
      return 444 'default_server not found server!!!';
    }
}



[root@nginx-100 /usr/local/nginx/conf]# nginx -t && nginx -s reload
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
View Code

浏览器访问:http://www.itheima.com/

image

[root@nginx-100 /usr/local/nginx/conf]# cat nginx.conf
user www;
worker_processes 2;
error_log logs/error.log;
pid logs/nginx.pid;
#daemon on; # 默认on

events {
    accept_mutex on;
    multi_accept on;
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  text/plain;

    sendfile        on;
    keepalive_timeout  65;
    
    server {
      listen 80;
      server_name ~^www\.\w+\.com$;
     
      return 200 'regex_success'; # 正则匹配成功
    }
   # server {
   #   listen 80;
   #   server_name www.itheima.*;
   #    
   #   return 200 'wildcard_after_success'; # 通配符在后匹配成功      
   # }
   # server {
   #   listen 80;
   #   server_name *.itheima.com;
   #   
   #   return 200 'wildcard_before_success'; # 通配符在前匹配成功     
   # }
   # server {
   #   listen 80;
   #   server_name www.itheima.com;
 
   #   return 200 'exact_success'; # 精确匹配成功
   # }
    server {
      listen 80;
      server_name _;
 
      return 444 'default_server not found server!!!';
    }
}
[root@nginx-100 /usr/local/nginx/conf]# nginx -t && nginx -s reload
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
View Code

浏览器访问:http://www.itheima.com/

image

[root@nginx-100 /usr/local/nginx/conf]# cat nginx.conf
user www;
worker_processes 2;
error_log logs/error.log;
pid logs/nginx.pid;
#daemon on; # 默认on

events {
    accept_mutex on;
    multi_accept on;
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  text/plain;

    sendfile        on;
    keepalive_timeout  65;
    
  #  server {
  #    listen 80;
  #    server_name ~^www\.\w+\.com$;
  #   
  #    return 200 'regex_success'; # 正则匹配成功
  #  }
   # server {
   #   listen 80;
   #   server_name www.itheima.*;
   #    
   #   return 200 'wildcard_after_success'; # 通配符在后匹配成功      
   # }
   # server {
   #   listen 80;
   #   server_name *.itheima.com;
   #   
   #   return 200 'wildcard_before_success'; # 通配符在前匹配成功     
   # }
   # server {
   #   listen 80;
   #   server_name www.itheima.com;
 
   #   return 200 'exact_success'; # 精确匹配成功
   # }
    server {
      listen 80;
      server_name _;
 
      return 444 'default_server not found server!!!';
    }
}
[root@nginx-100 /usr/local/nginx/conf]# nginx -t && nginx -s reload
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
View Code

浏览器访问:http://www.itheima.com/

image

42.2 总结

regex_success

wildcard_after_success

wildcard_before_success

exact_success

default_server not found server!!!

No.1:准确匹配 server_name

No.2:通配符在开始时匹配server_name成功

No.3:通配符在结束时匹配server_name成功

No.4:正则表达式匹配server_name成功

No.5:被默认的default_server处理,如果没有指定,默认匹配第一个server

 

———————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on 2026-05-09 21:09  马俊南  阅读(3)  评论(0)    收藏  举报