一个请求过来,nginx首先要判断哪个server去处理这个请求,如果请求的监听端口只包含在一个server里,请求会直接进到该server,如果多个server监听了同一个端口,nginx会根据header头中的Host去判断使用哪个server来处理该请求。以下面的三个server配置为例:
server {
listen 80;
server_name example.org www.example.org;
...
}
server {
listen 80;
server_name example.net www.example.net;
...
}
server {
listen 80;
server_name example.com www.example.com;
...
}
在该配置的情况下,nginx首先检测header中的Host,匹配到哪个server中的server_name字段就路由到那个server,如果都没有匹配,则采用默认路由,默认路由到第一个server,也可以通过在listen中配置default_server来指定默认server,具体配置如下:
server {
listen 80default_server;
server_name example.net www.example.net;
...
}
在匹配到对应的server之后,再根据server中配置的location规则进行相应的转发,location语法如下:
location [=|~|~*|^~] /uri/ { … }
= 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
~ 区分大小写匹配(可用正则表达式)
~* 不区分大小写匹配(可用正则表达式)
!~ 区分大小写不匹配
!~* 不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不再匹配别的规则
Location匹配的优先级如下:
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。举例如下:
location = / {
[ config A ]
}
location / {
[ config B ]
}
location /documents/ {
[ config C ]
}
location ^~ /images/ {
[ config D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ config E ]
}
上述匹配规则中:
“/”会匹配到config A
“/index.html”会匹配到config B
”/documents/document.html”会匹配到config C
”/images/1.gif”会匹配到config D
“/documents/1.jpg”会匹配到config E