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 的内容