nginx配置文件中的location部分主要用于对传入的URL进行匹配到特定的location,并从这个location中定义的目录下查找请求的文件。location部分支持正则。
location部分详细解释:
location配置规则讲解:
location / {
root html;
index index.html index.htm;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
关键字location后面紧跟的是对于URL的匹配规则,大括号里面的则是这个location的配置,详细如下:
root 定义这个location的查找资源的根目录,这个目录可以是绝对路径,也可以是相对路径
index 定义访问的默认首页
在定义location查找资源的目录时,还可以使用alias指令,他与root的区别如下:
# 假设客户端访问的URL为http://xxx/i/123.gif
alias指令将会在其定义的目录下查找123.gif这个文件
root指令将会在其定义的目录下的子目录i中查找123.gif
一般建议在location /中使用root指令来配置根目录,其他location使用alias指令。
而在第二段配置中,location中使用proxy_pass这个模块,proxy_pass模块一般用于进行反向代理。所以location中不仅可以定义root和index,还可以引用功能模块。
02location中URL匹配部分
预先的定义: 假设当前运行nginx主机的IP地址是192.168.0.110,没有配置域名解析,仅通过IP地址访问nginx。
我们看第一节中的第一个location ,匹配的URL规则是/,定义的根目录为html。也就是说,任何对于http://192.168.0.110的访问都将会在html目录下进行资源查找。这里的html目录就是一个相对目录,为nginx安装目录下的html目录。
其实,不仅是对于http://192.168.0.110这个主站的访问,对于http://192.168.0.110站点下的任意资源的访问都会在html目录下进行查找。例如:
访问http://192.168.0.110/1.jpg 此时主机上对应的目录文件为html/1.jpg
访问http://192.168.0.110/test/1.html 此时在主机上对应的目录文件为html/test/1.html
location在进行URL匹配时支持正则表达式,下面来看两个location配置:
location ~ .*\.(gif|jpg|png)$ {
root /test;
}
我们来分析下location后面的URL匹配部分,
~表示区分大小写匹配;
.为正则表达式的符号,表示匹配除\n之外的任意一个字符;
*也为正则表达式符号,表示匹前面的一次或者多次;
\为转义字符,表示将后面的,转义成正常的,而不是正则表达式符号;
(gif|jpg|png)表示匹配GIF或者jpg或者png中的任意一项;
$为正则表达式符号,表示匹配以前面的内容结尾。
所以这条location的含义为,当URL中gif|jpg|png结尾时,在test目录下查找相对应的资源。
location ~ ^/test/ {
root /htm;
}
^位正则表达式符号,表示匹配以后面的内容开头。所以这条location的含义为,当URL中以test开头时,在html/test目录下查找对应的资源。
注意:root定义的目录是根目录,所以这里对应的主机目录应该是/html/test
03location中URL匹配优先级
location支持各种匹配规则,在多个匹配规则下,nginx毒地location的处理是有优先级的。
location中的优先级规则是(从上到下有优先级依次降序):
等号类型(=) 该类型为精准匹配,一旦匹配成功则不再查找其他匹配项。
前缀普通匹配(^~) 不支持1正则表达式;如果有多个location都能匹配的话,优先匹配表达式最长location
正则表达式匹配,包括(区分大小写)和*(不区分大小写);正则匹配以上到下的顺序为优先级,一旦匹配一个则不再继续匹配
常规字符串匹配,如果有过个location都能匹配的话,优先配置表达式最长的location
一个特殊的location:
location = / {
root /test;
}
此时必须使用http://192.168.0.110才能匹配到该条规则而不是使用http://192.168.0.110 等号类型要求精准匹配才能命中。