nginx location

location指令可以用在虚拟服务器server部分,并且意味着提供来自客户端的URI或者内部重定向访问。

除少数情况外,location也可以被嵌套使用,他们被作为特定的配置尽可能地处理请求
定义:
location [modifier] uri { }
或者是命名location
location @name { }
命名location仅对内部访问重定向,在进入一个location之前它会保留被请求的URI部分。
命名location只能在server级别定义

修饰符

处理方式

=

使用精确匹配并且终止搜索

~

区分大小写的正则匹配

~*

不区分大小写的正则匹配

^~

如果该location是最佳匹配,那么对于匹配这个location的字符串不再进行正则表达式检测。

注意这不是一个正则表达式匹配--它的目的是优先正则表达式匹配

当一个请求进入时,URI将会被检测匹配一个最佳的Location

这里比较匹配描述的是解码URI,不如 URI中的”%20” 会匹配location中的 “”(空格)

优先级说明

与在配置中的Location顺序没有太大关系,和表达式的类型有关.

相同类型的表达式,字符串长的会有限匹配

第一优先级: 等号类型(=),一旦匹配成功,则不再查找其它匹配项

第二优先级:^~ 类型,一旦匹配成功,不再查找其它项

第三优先级: 正则表达式类型(~ ~*),如果有多个location的正则匹配,则使用正则表达式最长的那个

第四优先级:常规字符串匹配类型。按照前缀匹配比如 /string

当配置里是
location = /news{
           default_type text/html;
           return 200 request_uri:$request_uri<br>query_string:$query_string<br>=/news;
        }
location  /news{
   default_type text/html;
   return 200 request_uri:$request_uri<br>query_string:$query_string<br>/news;
}

=/news 匹配/news ,/news?....
/news匹配 /news任意字符

访问/news
返回
request_uri:/news
query_string:
=/news
访问 /news?a=1#b=2
request_uri:/news?a=1
query_string:a=1
=/news
访问 /news/
返回
request_uri:/news/
query_string:
/news
访问 /news/abc?a=1#b=2
返回
request_uri:/news/abc?a=1
query_string:a=1
/news
当配置里是
location ~ /news/abcd{
           default_type text/html;
            return 200 request_uri:$request_uri<br>query_string:$query_string<br>=/news/abcd;
        }

location ~ /news/abc{
            default_type text/html;
            return 200 request_uri:$request_uri<br>query_string:$query_string<br>=/news/abc;
        }
location  /news{
   default_type text/html;
   return 200 request_uri:$request_uri<br>query_string:$query_string<br>/news;
}
访问 /news/ab
返回
request_uri:/news/ab
query_string:
/news
请求 /news/abc
返回
request_uri:/news/abc
query_string:
=/news/abc
请求 /news/abcd
返回
request_uri:/news/abcd
query_string:
=/news/abcd
说明同类表达式以更长的表达式为准(~ /news/abcd 与 ~ /news/abc )
~ /news/abc里的设置不会影响到~ /news/abcd
根目录下有/static目录,目录里有index.html,1.html
location /static{
try_files $uri @static_req;
}
location @static_req{
default_type text/html;
return 200 request_uri:$request_uri<br>request_filename:$request_filename<br>query_string:$query_string<br>=@static_req;
}
请求 /static
返回
request_uri:/static
request_filename:/mnt/hgfs/www/h/static
query_string:
=@static_req
请求 /static/
request_uri:/static/
request_filename:/mnt/hgfs/www/h/static/
query_string:
=@static_req
/ 里是有配置 Index index.html的
这里index.html没被请求到
请求 /static/index.html,/static/1.html 均返回各自文件的内容,不存在的文件就会转到 @static_req
当配置改为
location /static{
try_files $uri $uri/ @static_req;
}
请求 /static
会产生301 到/static/
返回/static/index.html 的内容