Nginx配置文件中的location部分主要用来对于传入的URL进行匹配到特定的location,并从这个location中定义的目录下查找请求的文件。location部分支持正则。
1、location部分详解
我们先来看下nginx.conf中原有的两段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指令来配置根目录,其他locaiton使用alias指令。
而在第二段配置中,location中使用了proxy_pass这个模块,proxy_pass模块一般用于进行反向代理。所以location中不仅可以定义root和index,还可以引用功能模块。
2、location中的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/开头时,在/htm/test目录下查找相应的资源。注意:root定义的是根目录,所以这里对应的主机目录应该为/htm/test。
3、location中的URL匹配优先级
location支持各种匹配规则,在多个匹配规则下,Nginx对location的处理是有优先级的。
location中的优先级规则为(从上到下优先级依次降低):
- 等号类型(=),该类型为精确匹配,一旦匹配成功则不再查找其他匹配项
- 前缀普通匹配(^~),不支持正则表达式;如果有多个location都能匹配的话,优先匹配表达式最长的location
- 正则表达式匹配,包括~(区分大小写)和~*(不区分大小写);正则匹配以从上到下的顺序为优先级,一旦匹配一个则不再继续匹配
- 常规字符串匹配,如果有多个location都能匹配的话,优先匹配表达式最长的location
一个特殊的location:
location = / {
root /test;
}
此时必须使用http://192.168.0.110/才能匹配到该条规则而不是使用http://192.168.0.110,等号类型要求精确匹配才能命中。