一   location

server块中的'rewrite'阶段执行完,进入'find_config'阶段,进行'location'匹配

①   location

细节点: '$uri[不携带查询参数的path]'与'location'进行匹配特点: 根据'用户请求的URI'来匹配'location',匹配'success'则执行对应的'configure'配置块

②  location中的符号

++++++++++++ '几种符号的理解'  ++++++++++++(1) 第'1'阶段:'前缀(prefix)'匹配  --> 'the longest prefix mactch''=': 表示'精准exact'匹配,必须'完全一致才会停止'匹配其它的location'^~':也是'前缀'匹配,'no regex';但是只有是'最长前缀匹配'时,才会'停止匹配'其它的location'空':表示一般'prefix前缀'匹配(2) 第'2'阶段:'正则(regular)'匹配'~': 区分'大小写''~*':不区分大小写备注: 不能在location 'regular'中使用'!'(3) '命名@'匹配应用场景:'error_page'、'try_files'指令、'X-Accel-Redirect'响应头可以使用关注点:什么是'prefix string'?、什么是'regular expression'? --> "对应哪些修饰符"?

location 匹配规则详解

1.location 的匹配'查找'顺序是"先匹配普通,再匹配正则"'一句话'总结:1) 正则 location 匹配'让步'普通 location 的严格精确匹配结果2) 但'覆盖'普通 location 的'最大'前缀匹配结果

③  最长前缀匹配的底层逻辑

nginx会在'启动'过程中,将'server{}内'的所有location'基于前缀'的包含关系,建立一颗'多叉树'++++++++++++ "假定这些无modifier的前缀location" ++++++++++++location /test             {root html;}
location /res              {root html/res;}
location /res/img          {root html/res/img;}
location /res/video        {root html/res/video;}
location /                 {root html/res;}
location /resource/js      {root html/res;}
location /resource/image   {root html/res;}
location /his              {root html/res;}
location /his/20           {root html/res;}
location /his/2020         {root html/res;}
location /his/20/02        {root html/res;}
location = /50x.html       {}1)如下'12'个location将会构造出1颗'4层的静态树'2)其中'子树'中的所有location,都是比'父结节更长'的前缀location3)在'同一层'的结点中,它们互不相属,但却是'基于字母表'有序的++++++++++++ "顺序排列问题"  ++++++++++++

图片链接来源

nginx源码分析location

④  如何匹配正则表达式location

说明: 遇到'前缀匹配无法覆盖'的url时,可以使用'正则表达式'匹配请求1)多个正则表达式location之间的'匹配次序'2) 按照它们在server{}块中'出现'的位置,'依次'匹配,直接使用'最先命中'的location即可2)注意:当'上方'的正则表达式匹配'范围过大'时,下方的正则表达式location可能永远也'无法命中'

⑤  正则表达式与前缀location同时出现时

1)= 前缀精确匹配

1)在执行'前缀'匹配时,如果URL与location'完全相等'2)那么nginx'不会再检索'子树寻找更长的'前缀'匹配,但还会执行'正则'表达式匹配3)如果你希望'URL完全相等'后,'不必'再匹配正则表达式location,那么可以在location前增加'='号4)应用场景:如果某些页面'访问频率'非常高,你应该用'='号加快location的'匹配'速度

2) ^~

注意:只有'最长匹配上'携带'^~'符号,才能够'跳过'正则表达式

+++++++++++++ "解读"  +++++++++++++1)虽然这个请求'同时命中了3个'location2)但'2个前缀'location中[1]、/redirect1虽然带有'^~'符号,可惜它却'不是最长'的前缀匹配[2]、而/redirect11虽然是'最长'前缀,但又'不能阻止'正则表达式3)最终'/redirect1(\d)?'匹配上'url'

⑥  location匹配顺序

++++++++++++ '优先级问题'  ++++++++++++注意:不是按照'nginx.conf'配置文件的'location'先后顺序匹配的(1) 先匹配所有的'prefix location'(2) 首先'='前缀精准匹配,匹配成功立即'处理并且停止'location继续匹配(3) 如果'没有'精准匹配,会进行'^~前缀匹配',^~匹配上也会立即'处理并且停止'location继续匹配(4) 如果'='和'^~'都没有匹配上,暂存'最长'前缀匹配,开始进行'正则匹配'(5) 如果'正则'匹配,则使用'正则匹配上'的,否则'使用之前暂存'的"最长前缀字符的location"细节点: 不考虑'~'和'~*'正则的优先级,'正则'完全按照'配置'文件的顺序++++++++++++ 'location / 兜底原因 '  ++++++++++++1) 为了'避免'第1步中就'没有找到'能匹配上的前缀location,导致基于'root'直接返回'404'2) 通常会在'末尾'添加'location / {}'兜底,它可以匹配'任意'URL,相当于'switch default'

⑦  官方案例

⑧  @name 定义命名location

1: '修饰符@'用于定义一个'内部' location 块,该块'不能'被外部 client '直接'访问2: 只能被 nginx '内部配置指令'所访问:比如 'try_files' 或者'error_page'备注:'internal'也是'同样'的效果

+++++++++++  'error_page'中 '@' 使用  +++++++++++  location 的'内部跳转'匹配符号'@':location /index/ {error_page 404 @index_error;
}location @index_error {return 404 'ok\n';
}解读:以 /index/ 开头的请求,如果'现状态码是 404',则会匹配到 @index_error 这条'规则'上+++++++++++  'try_files'中 '@' 使用  +++++++++++ location / {try_files $uri $uri/ @custom
}location @custom {# ...do something
}

⑨  location嵌套

说明: 了解'有这种用法'即可,下面进行了'详细'的解读

⑩  加不加/问题

纠正: '/user'和'/user/'有区别的 --> /user会'返回301'和 'user/ 重定向'

二  location nested location

①  存在父子关系的location条件限制

location快速查询

+++++++++++++++  location共分为'四'种  +++++++++++++++1) exact_match:"="类型,'精准'匹配;2) noregx:"^~[特殊]"或""类型,'非正则'的特殊'前缀'匹配;3) regex:"[!]~[*]",正则匹配;4) named:"@"类型,'内部'跳转匹配,也是'精确匹配';+++++++++++++++ 对于存在'父子关系'的location  +++++++++++++++1) 父只能是'noregex'或'regex'类型;2) 子location'不能'是named类型;3) 子的name'不能'包含父

+++++++++++ "一般正则嵌套的风格 [正常的]"  +++++++++++server {location /images {location /images/icons {# ...}location /images/photos {# ...}}
}

②  动作指令和值指令

1) 值指令:存储'配置项的值[静态]',是用来'配置'某一个配置项的,可以'继承|覆盖'eg: root、add_header、access_log、index等2) 动作类指令:指定行为'动作action',往往表示接下来'要做'一件事情,不可以'合并被继承'eg: rewrite、proxy_pass、try_files、return3) 指令分类:Normal、Array、Action、Action、try_filesNormal指令    - 每个上下文一个值,例如:"root"或"index"Array指令     - 每个上下文可以有,'多个'值,例如:"access_log"或"add_header"Action指令    - 不只是配置的东西,例如:"rewrite"try_files指令 - 'server'或'location'上下文不同4) 目的: 'location嵌套location',一些'继承和覆盖'问题,基本同之前'context'备注:'子location'作用域名小于'父'location

Nginx 配置继承模型

Standard Type Directives Array Type Directives Command Type Directives

③  location嵌套改变find_location

location in location的优先级    原始嵌套解读

1) Exact string  'exact matches' location = /foo2) The 'longest' of any location '^~' ... matches3) The 'first (exact prefix |regex match)' that \is nested within the single longest 'matching prefix' match!备注:原文描述的结论'不准确',这里做了'修改'4) The first 'other regex' match location '~' regex5) The 'longest prefix match' location /foo

注意事项:子location要包含在父location中

++++++++++ "案例讲解" ++++++++++'难点'理解:1) 如果对应'location'嵌套的是'prefix location',并且是'longest prefix match'2) 重新按照'=、^~、regular'顺序在'子location'中寻找不同点:在嵌套中'^~'是最长'前缀'匹配,会停止'该level的regular',但是不会停止'父regular'grep -En 'test location|using configuration' /var/log/nginx/error.log '看过程'

案例1: '/wzj'请求第'1'阶段:'/wzj' 是'最长'的前缀匹配,发现是'嵌套',然后'=和^~'都不匹配,则使用嵌套'regular'

案例2: '/wzj11'请求第'1'阶段: '/wzj1 [最长的前缀匹配]',但不是'=、^~',不能停止'regular'第'2'阶段: 使用 '~ wzj'

案例3: '/wzj22'请求第'1'阶段: '/wzj [最长的前缀匹配]',查看该嵌套的'= /wzj22',则'停止'后续的location查找思考: '/wzj222'呢? --> '~ /wzj(.*)' --> nested location regular 222 ok!

案例4: '/wzj3'请求细节点: 1) 第'1'阶段: '/wzj [最长的前缀匹配]',查看该嵌套的'^~ /wzj3 [最长前缀匹配]'2) 'nested location'中,'^~ /wzj3'使'该level'下的正则'~ ^/wzj(.*)'停止3) 但是没有作为'最终的'location,而是'跳出嵌套location',继续寻找父regular '~ /wzj'

案例5: '/wzj33'请求  --> "同上"

L1 L2 L3   proxy_set_header

nginx nested location add_header

三   相关参考

location最佳实践参考

深入理解location匹配规则

一文理清nginx中的location配置

location讲解最好的博客

URL是如何关联location配置块的

辉神URL是如何关联location配置块的

重定向和请求转发的区别

location匹配小结

更详细的正则匹配

nginx 的location详细理解

nginx的正则表达

nginx 下 location 某个文件夹下某类文件

Nginx location 匹配规则

题外话: 1) location是基于'$uri'进行find_location匹配的2) '$uri'是'decode解码'后的,'不带'查询参数;'$request_uri'是'原始 url encode的'带参

 +++++++++++++  "动静态分离"  +++++++++++++1)如何识别'静态'页面,让'web服务器(nginx)'处理      常用: '/static'或者'\.(?:html|js|jpg)',通过'root指令'2)如何识别'动态'页面,让'应用服务器(tomcat、django)' 常见: 'proxy_pass、grpc_pass、fastcgi_pass'其它: rewrite ^/pets/rabbits/?$ /pets/rabbits.html last;  --> '解决带不带/'的问题

nginx(九)find_config阶段的location指令相关推荐

  1. Nginx的location指令

    location指令 server{listen 80;server_name localhost;location / {}location /abc{}... } location:用来设置请求的 ...

  2. [Nginx]location 指令说明

    location 指令说明 该指令用于匹配 URL. 语法如下: 1.= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求. ...

  3. nginx中的location指令

    1.location 介绍 location是Nginx中的块级指令(block directive),location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,这其中较难理 ...

  4. nginx location指令用法

    nginx使用location指令去匹配不同的路径 nginx首先通过路径的前缀去匹配 此时用法就是如下: # url就是路径的前缀,比如/, 比如/aaa location url {...} lo ...

  5. location ~ .php$,nginx location指令详解,

    nginx location指令详解, location匹配的是nginx的哪个变量? $request_uri location的匹配种类有哪些? =开头表示精确匹配 ^~ 开头,注意这不是一个正则 ...

  6. Nginx的执行阶段详解

    在了解nginx的执行阶段前,先看一个例子 对echo不熟悉的,可以先看文章Nginx调试必备了解下echo扩展 回到上面这个例子,在server块中配置这样的location,你觉得输出是什么样子? ...

  7. Nginx的启动阶段讲解

    Nginx的启动阶段讲解 概述 nginx启动阶段指从nginx初始化直至准备好按最新配置提供服务的过程. 在不考虑nginx单进程工作的情况下,这个过程包含三种方式: 启动新的nginx reloa ...

  8. Nginx源码分析之 upstream指令

    #Nginx 源码分析 upstream指令 想要的解决问题: 1:upstream存储结构 2:动态 upstream 流程(proxy_pass跟随变量或者域名) 最简单的配置文件 http {u ...

  9. nginx服务(五)_常用配置指令介绍

    Main 全局配置段常见的配置指令分类 文档: https://nginx.org/en/docs/ngx_core_module.html#accept_mutex 分类: 正常运行必备的配置 优化 ...

最新文章

  1. liunx tar安装mysql_在Linux下,安装Mysql(tar)
  2. SoundPool 音频播放 详解 示例
  3. 阅读开源源码的正确姿势建议
  4. SpringBoot实现Redis分布式锁
  5. js添加多个子节点_DOM节点
  6. 经典问题:微服务和分布式的区别
  7. 电脑复制粘贴_手机扫一扫,现实物体隔空复制粘贴进电脑!北大校友的AI新研究,现在变成AR酷炫应用...
  8. mysql 更新时间加数字_Mysql实战45讲笔记:8、聚合函数count
  9. python取列表中位数_Python如何获取列表(List)的中位数
  10. java多线程知识汇总(三)如何选择锁?如何加锁
  11. javascript手机号码、电子邮件正则表达式 一种解决方案
  12. linux配置网络参数
  13. oracle 列出asm磁盘,如何列出ASM磁盘组的所有磁盘
  14. java程序包condition不存在,Ant javac:包x不存在,但我将x.jar添加到java构...
  15. 重庆师范大学c语言考研真题及答案,2020年重庆师范大学系统理论考研真题试卷及试题答案,数学分析考研试题下载...
  16. psp模拟器完美字库_安卓PSP模拟器评测:假面骑士超巅峰英雄
  17. 嵌入式linux locale,总结!嵌入式linux基础学习笔记
  18. 闲鱼服务端架构演进历程
  19. 老鹰主机怎么样_HawkHost老鹰主机香港机房速度怎么样?
  20. python中str,int,list,list(str),list(int)的相互转换

热门文章

  1. Python的基本知识与安装
  2. 排序 - - -归并排序(二路归并)
  3. 小米枪战不显示服务器,小米枪战怎么进不去 小米枪战进不去解决方法
  4. pos请求 微信小程序_微信小程序蓝牙连接小票打印机实例代码详解
  5. 【物理】斜面交点之处机械能/动量损失问题
  6. ubuntu Wine war3.exe
  7. Visual C++网络编程案例实战
  8. java set 的使用方法_Java中Set的使用(转载)
  9. Java8函数式编程(Lambda表达式,Stream流,Optional)
  10. 什么是DNS服务器?有哪些作用?