杉哥的个人博客

nginx中的location配置详解

官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

在使用Nginx做虚拟主机配置的时候,我们需要给对应的虚拟主机配置网站目录,可以使用location段来进行配置。nginx的配置信息使用的类似编程语言的风格来实现的。

语法格式:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
http {
server {
listen 80;
server_name t.cn; # 域名或者是IP地址
location [模式修饰符] 定义匹配模式 {
root /var/www/html;
index index.htm index.html;
} #可以存在多个的,类似httpd directory
location / {
root html; # 规定虚拟主机的目录,可以是相对目录(相对于Nginx安装目录来说的),也可以是绝对路径(相对Linux的 /)
index index.html index.htm; # 配置默认的index首页
}
} # 代表是一个虚拟主机
server {
listen 80;
server_name t.cn;
location [模式修饰符] 定义匹配模式 {
root /var/www/html;
index index.htm index.html;
}
} # 代表是另外一个虚拟主机
}
http { server { listen 80; server_name t.cn; # 域名或者是IP地址 location [模式修饰符] 定义匹配模式 { root /var/www/html; index index.htm index.html; } #可以存在多个的,类似httpd directory location / { root html; # 规定虚拟主机的目录,可以是相对目录(相对于Nginx安装目录来说的),也可以是绝对路径(相对Linux的 /) index index.html index.htm; # 配置默认的index首页 } } # 代表是一个虚拟主机 server { listen 80; server_name t.cn; location [模式修饰符] 定义匹配模式 { root /var/www/html; index index.htm index.html; } } # 代表是另外一个虚拟主机 }
http {
    server {
    listen 80;
    server_name t.cn; # 域名或者是IP地址

        location [模式修饰符] 定义匹配模式 {
            root /var/www/html;
            index index.htm index.html;

        } #可以存在多个的,类似httpd directory

        location / {
        root html; # 规定虚拟主机的目录,可以是相对目录(相对于Nginx安装目录来说的),也可以是绝对路径(相对Linux的 /)
        index index.html index.htm; # 配置默认的index首页
        }
    } # 代表是一个虚拟主机

    server {
        listen 80;
        server_name t.cn;

        location [模式修饰符] 定义匹配模式 {
        root /var/www/html;
        index index.htm index.html;
        }
    } # 代表是另外一个虚拟主机
}

 

这里的【定义匹配模式】可以是:

  1. 一般匹配,则书写普通的字符串即可
  2. 正则表达式,如果是正则表达式需要使用 ~ 标识
  3. 精准字符串,如果是精准字符串匹配则需要使用 = 标识

匹配优先级:

  1. 先精准匹配,如果匹配成功,并里面结束并返回解析过程,优先级最高
  2. 判断一般字符串匹配,如果有多个匹配,则记录最长的满足条件的匹配结果,但不返回
  3. 继续判断正则表达式的结果,按正则表达式的顺序由上到下匹配,一般匹配成功,立马返回匹配结果,并结束解析过程

注意:

  1. 一般字符串匹配则与顺序无法,按满足匹配条件最长的返回
  2. 正则匹配和顺序有关,由上到下匹配

①-location最左前缀匹配:

当用户在location里面没有使用模式修饰符的时候定义的规则称为一般规则,优先级是最低的。当用户输入某个地址,则会使用一般规则去匹配用户地址栏里面的 URI信息,如果匹配的时候,存在多个一般规则都可以匹配上,则会使用匹配规则最长的那个规则进行生效

解释:当定义好一般规则后,会使用该规则去匹配URL地址里面的URI部分,并且是从URI的最左边开始进行匹配,当存在多个规则都满足条件的时候,则使用匹配度最高的(匹配规则最长的那个进行命中)。

例:

现在存在如下两个一般规则:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 规则一:
location / {
root /usr/local/tengine/html;
index index.html index.htm;
}
# 规则二:
location /images {
root /var/www/html; # /var/www/html + images/1.jpg
index index.html index.htm;
}
# 规则一: location / { root /usr/local/tengine/html; index index.html index.htm; } # 规则二: location /images { root /var/www/html; # /var/www/html + images/1.jpg index index.html index.htm; }
# 规则一:
location / {
root /usr/local/tengine/html;
index index.html index.htm;
}

# 规则二:
location /images {
root /var/www/html; # /var/www/html + images/1.jpg
index index.html index.htm;
}

 

如果现在用户请求这个地址:http://t.cn/images/1.jpg

这个时候URI是 /images/1.jpg

此时 此时规则一和规则二都可以生效的情况下,则匹配规则长的那个生效(规则二生效)

②-location精准匹配:

当出现精准匹配后,如果匹配成功,则立马停止。在匹配规则里面 精准匹配的优先级是最高的。(和一般规则、正则匹配)

③-location正则匹配:

例:我们现在把用户请求的图片类型的资源转移到一个专门存放图片信息的目录下。

书写规则:*\.(jpg|png|gif)$ 代表任何以jpg或者png或者是gif结尾的文件

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
location ~ .*\.(jpg|png|gif)$ {
root /var; # /var + /images/1.jpg # /var + / article/images/2.png
index index.html index.htm; # 一般我们在每个目录下都定义一个index.html文件,防止用户请求的index.html文件不存在的时候,列出目录的列表信息
}
location ~ .*\.(jpg|png|gif)$ { root /var; # /var + /images/1.jpg # /var + / article/images/2.png index index.html index.htm; # 一般我们在每个目录下都定义一个index.html文件,防止用户请求的index.html文件不存在的时候,列出目录的列表信息 }
location ~ .*\.(jpg|png|gif)$ {
        root /var; #   /var + /images/1.jpg   # /var + / article/images/2.png    
        index index.html index.htm; # 一般我们在每个目录下都定义一个index.html文件,防止用户请求的index.html文件不存在的时候,列出目录的列表信息
    }