1.location
参考:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html
语法 | location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } |
默认值 | - |
上下文 | server, location |
1.1 举一个“栗子”:
让我们用一个例子解释上面的说法:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
请求“/”匹配配置A,
请求“/index.html”匹配配置B,
请求“/documents/document.html”匹配配置C,
请求“/images/1.gif”匹配配置D,
请求“/documents/1.jpg”匹配配置E。
1.2 location 映射(ngx_http_core_module)
location [ = | ~ | ~* | ^~ ] uri { ... }
location URI {}: 对当前路径及子路径下的所有对象都生效;
location = URI {}: 注意URL最好为具体路径。 精确匹配指定的路径,不包括子路径,因此,只对当前资源生效;
location ~ URI {}:
location ~* URI {}: 模式匹配URI,此处的URI可使用正则表达式,~区分字符大小写,~*不区分字符大小写;
location ^~ URI {}: 不使用正则表达式 优先级:= > ^~ > ~|~* > /|/dir/
2.location配置规则
- =前缀的指令严格匹配这个查询。如果找到,停止搜索。
- 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
- 正则表达式,在配置文件中定义的顺序。
- 如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用
- location 的执行逻辑跟 location 的编辑顺序无关。
矫正:这句话(下划线+斜体)不全对,“普通 location ”的匹配规则是“最大前缀”,因此“普通 location ”的确与 location 编辑顺序无关;
但是“正则 location ”的匹配规则是“顺序匹配,且只要匹配到第一个就停止后面的匹配”;
“普通location ”与“正则 location ”之间的匹配顺序是?先匹配普通 location ,再“考虑”匹配正则 location 。
注意这里的“考虑”是“可能”的意思,也就是说匹配完“普通 location ”后,有的时候需要继续匹配“正则 location ”,有的时候则不需要继续匹配“正则 location ”。两种情况下,不需要继续匹配正则 location :
( 1 )当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配;
( 2 )当普通location 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则
3.请求
nginx 收到请求头:判定ip,port,hosts决定server
请求头:
- host:决策server负责处理
- uri:决策location
- 反向代理:proxy_pass ip:port[uri];