青蛙学Linux—Nginx配置文件中的location详解

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,等号类型要求精确匹配才能命中。

posted @ 2019-01-03 10:08  青蛙学Linux  阅读(6060)  评论(0编辑  收藏  举报