Skip to content

Latest commit

 

History

History
100 lines (88 loc) · 2.25 KB

nginx之server_name匹配.md

File metadata and controls

100 lines (88 loc) · 2.25 KB

前言

本来想了解server_name匹配机制,经过资料查阅,关键问题在listen指令。

listen

server块通常包含一个listen指令用来指定一个ip地址和一个端口。

server {
    listen 127.0.0.1:8080;
    # Additional server configuration
}
server {
    listen 8080;
    # Additional server configuration
}
server {
    listen 127.0.0.1;
    # Additional server configuration
}

server_name

服务器名通过server_name指令来定义,当多个listen指令都可以匹配到,通过server_name来和请求的Host头进行匹配。

server_name通常有三种形式:确切的名字,通配符,正则。server_name可以指定多个,以空格分隔。

说明一点,不指定server_name,nginx会认为是""空字符。

server {
    listen       80;
    server_name  example.org  www.example.org "";
    ...
}

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

server {
    listen       80;
    server_name  ~^(?<user>.+)\.example\.net$;
    ...
}

default_server

listen指令还有一个default_server参数。

server {
    listen 80 default_server;
    #...
}

当多个listen的ip:port都匹配到了,server_name都匹配不到,nginx会匹配进带有default_server的server。

如果没有指定default_server,nginx会把第一个监听到的server作为default_server。

如何确定第一个server呢?经过试验,我认为分两种情况:1.同一个配置文件 2.不同配置文件。

同一个配置文件,按从上到下的顺序进行查找,找到第一个

server {#匹配这个server
    listen 80;
    server_name a;
    #...
}
server {
    listen 80;
    server_name b;
    #...
}

不同配置文件,按配置文件名首字母大小字符编码大小进行查找,找到第一个

#b.conf
server {
    listen 80;
    server_name a;
    #...
}

#a.conf
server {#匹配这个server,文件名是a.conf
    listen 80;
    server_name a;
    #...
}

参考

1.http://nginx.org/en/docs/http/request_processing.html 2.http://nginx.org/en/docs/http/server_names.html 3.https://docs.nginx.com/nginx/admin-guide/web-server/web-server/