简单梳理一下nginx中关于server 和location的配置.
比如URL:www.mask_dev2.com:9999/login/
server管的前半部分,即:www.mask_dev2.com:9999
location管的是后半部分,即:/login/
一个nginx可以配置多个server。
每个server可以配置多个location。
URL的前半部分控制选择哪一个server,后半部分控制选择哪一个location,最终决定往哪里去请求.
server的配置
server {
listen 9999;
server_name www.mask_dev2.cn;
location / {
default_type text/html;
content_by_lua '
ngx.say("<p>first</p>")
';
}
}
server {
listen 9999;
server_name www.mask_dev2.*;
location / {
default_type text/html;
content_by_lua '
ngx.say("<p>second</p>")
';
}
}
server {
listen 9998;
server_name _;
location / {
default_type text/html;
content_by_lua '
ngx.say("<p>third</p>")
';
}
}
首先,请求nginx的地址,肯定是请求的nginx所在的服务器,也就是说ip是固定的。
也就是说,无所谓server_name是什么,都是指的当前服务器.
那么当前服务器是怎样对应多个域名呢,这个只需要在相应的dns服务器中进行添加,就行了,比如暂时把本机当成dns服务器,修改hosts
127.0.0.1 localhost
127.0.0.1 www.mask_dev2.cn
127.0.0.1 www.mask_dev2.com
server匹配顺序
server_name与host匹配优先级如下:
1、完全匹配
2、通配符在前的,如*.test.com
3、在后的,如www.test.*
4、正则匹配,如~^.www.test.com$
如果都不匹配
1、优先选择listen配置项后有default或default_server的
2、找到匹配listen端口的第一个server块
location配置
找到server之后,再去找具体的location
server {
listen 9998;
server_name _;
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ .(gif|jpg|png|js|css)$ {
#规则D
}
location ~* .png$ {
#规则E
}
location !~ .xhtml$ {
#规则F
}
location !~* .xhtml$ {
#规则G
}
location / {
#规则H
}
语法规则:
location [=||*|^~] uri { … }
-
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ static /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):








