nginx location ( 属于Nginx core 模块 )
官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
Syntax: | location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } |
---|---|
Default: | — |
Context: |
server , location
|
location 分类及用法
location 分为两类 普通 location 和 正则 location
Syntax | 分类 | 说明 |
---|---|---|
location [ = | ^~ | @ ] uri { ... } | 普通 location | 不带任何前缀 或 = ^~ @ 前缀是普通 location |
location [ ~ | ~* ] uri { ... } | 正则 location | 带 ~ 和 ~* 前缀是正则 location |
location 执行流程
- 先 匹配普通 location, 匹配到后继续搜索其他普通 location, 选择最大前缀匹配结果,临时保存.
- 再 匹配正则 location, 正则匹配内部按照顺序 ( 编辑顺序,从上到下 )匹配,匹配到第一条正则location,则不继续匹配后面正则location,覆盖最大前缀的普通匹配结果,使用.
- 如果未能 匹配到正则 location,则使用普通location的最大前缀匹配结果.
- 通常的规则是,匹配完了“普通location ”指令,还需要继续匹配“正则location ”,但是可以告诉Nginx :匹配到了“普通location ”后,不再需要继续匹配“正则location ”了,只要在“普通location ”前面加上“^~ ”符号(^ 表示“非”,~ 表示“正则”,字符意思是:不要继续匹配正则),还可以 前面加上 "=" 符号,(= 表示精确匹配)
- ^~ 和 = 都能阻止继续搜索正则location,区别是, ^~ 也遵守最大前缀匹配规则,需要继续匹配最大前缀,=是严格匹配,不遵守最大匹配规则.直接使用.
正则 location 匹配让步普通location 的严格精确匹配结果( =和^~ );但覆盖普通 location 的最大前缀匹配结果
文章开始说了location 的语法中,可以有“= ”,“^~ ”,“~ ”和“~* ”前缀,或者干脆没有任何前缀,还有“@ ”前缀,但是后面的分析我们始终没有谈到“@ ”前缀。文章最后点内容,介绍了“@”的用途:“@ ”是用来定义“Named Location ”的(你可以理解为独立于“普通location (location using literal strings )”和“正则location (location using regular expressions )”之外的第三种类型),这种“Named Location ”不是用来处理普通的HTTP 请求的,它是专门用来处理“内部重定向(internally redirected )”请求的。注意:这里说的“内部重定向(internally redirected )”或许说成“forward ”会好点,以为内internally redirected 是不需要跟浏览器交互的,纯粹是服务端的一个转发行为。
网友评论