今天深入研究了下nginx的location的用法,已经一些需要注意的细节,现在做一个归纳总结,以备后面查询。

location匹配的是nginx的哪个变量?

  1. $request_uri

location的匹配种类有哪些?

  1. 格式 location [ 空格 | = | ~ | ~* | !~ | !~* ] /uri/ {}
  2. # 精确匹配: 相等(=)
  3. # 字符串匹配: 字符串匹配(空格) 匹配开头(^~)
  4. # 正则匹配: 区分大小写匹配(~) 不区分大小写匹配(~*) 区分大小写不匹配(!~) 不区分大小写不匹配(!~*)

location搜索优先级优先级如何?

  1. 精确匹配 > 字符串匹配( > [ 注: ^~ 匹配则停止匹配 ]) > 正则匹配( > )
  2. # 精确匹配只能命中一个
  3. # 字符串匹配使用匹配最长的最为匹配结果
  4. # 正则匹配按照location定义的顺序进行匹配,先定义具有高优先级

特别注意: 字符串匹配优先搜索,但是只是记录下最长的匹配 ( 如果 ^~ 是最长的匹配,则会直接命中,停止搜索正则 ),然后继续搜索正则匹配,如果有正则匹配,则命中正则匹配,如果没有正则匹配,则命中最长的字符串匹配.

举例说明

( 这里使用了 echo-nginx-module 模块,方便做输出测试 )

  1. 精确匹配
  2. location = /images/test.png {
  3. echo 'config1';
  4. }
  5. location /images/test.png {
  6. echo 'config2';
  7. }
  8. location \/images\/test\.png$ {
  9. echo 'config3';
  10. }
  11. 如果此时请求 http://127.0.0.1/images/test.png 会输出什么呢?
  12. 输出 config1, 毋容置疑,精确匹配优先级最高!
  1. 精确匹配的特殊情况
  2. location = / {
  3. index index.html;
  4. }
  5. location / {
  6. echo 'config2';
  7. }
  8. 此时是输入http://127.0.0.1 会输出什么呢?
  9. 是输出 config2, 怎么精确匹配的优先级不灵了呢?
  10. 是这样的,精确匹配还是起作用了,请求目录(非具体文件),nginx会将请求内部定向到index文件,
  11. 既此时真正的请求是http://127.0.0.1/index.html, 这是 config2则被命中!
  12. 所以精确匹配不要用来匹配 /
  1. 字符串搜索与正则搜索
  2. location /images/test.png {
  3. echo 'config1';
  4. }
  5. location ^~ /images/ {
  6. echo 'config2';
  7. }
  8. location ~ \/images\/test\.png$ {
  9. echo 'config3';
  10. }
  11. location ~ \/images\/ {
  12. echo 'config4';
  13. }
  14. 如果此时请求 http://127.0.0.1/images/test.png 会输出什么呢?
  15. 当然是 config3,正则命中
  16. (虽然 config1 为最长匹配的字符串,此时只做记录,后面还要搜索正则匹配,则config3正则匹配命中),
  17. 仔细观察可以发现config4也被匹配成功了,但是正则的匹配顺序是按照location的定义顺序匹配的,所以config3命中.
  1. 字符串匹配优先级的提升( ^~ )
  2. location /images/ {
  3. echo 'config1';
  4. }
  5. location ^~ /images/test.png {
  6. echo 'config2';
  7. }
  8. location ~ /images/test\.png$ {
  9. echo 'config3';
  10. }
  11. location ~ \/images\/ {
  12. echo 'config4';
  13. }
  14. 如果此时请求 http://127.0.0.1/images/test.png 会输出什么呢?
  15. 当然是config2, 首部匹配命中
  16. (因为字符串匹配是优先搜索的,此时发现config2 为最长的字符串匹配且为^~匹配方式,所以停止搜索正则,直接命中!)
  1. # 所以这里的 ^~ 符号比较特殊,就是为了提高字符串匹配的优先级,优先于正则匹配.

nginx配置:location配置方法及实例详解的更多相关文章

  1. jQuery中on()方法用法实例详解

    这篇文章主要介绍了jQuery中on()方法用法,实例分析了on()方法的功能及各种常见的使用技巧,并对比分析了与bind(),live(),delegate()等方法的区别,需要的朋友可以参考下 本 ...

  2. 【转】【Centos】nginx配置:location配置方法及实例详解

    location匹配的是nginx的哪个变量? $request_uri location的匹配种类有哪些? 格式 location [ 空格 | = | ~ | ~* |^~ | !~ | !~* ...

  3. 【转】nginx配置:location配置方法及实例详解

    location匹配的是nginx的哪个变量? $request_uri location的匹配种类有哪些? 格式 location [ 空格 | = | ~ | ~* | !~ | !~* ] /u ...

  4. 【配置属性】—Entity Framework实例详解

    Entity Framework Code First的默认行为是使用一系列约定将POCO类映射到表.然而,有时候,不能也不想遵循这些约定,那就需要重写它们.重写默认约定有两种方式:Data Anno ...

  5. 【配置关系】—Entity Framework实例详解

    实体间的关系,简单来说无非就是一对一.一对多.多对多,根据方向性来说又分为双向和单向.Code First在实体关系上有以下约定: 1. 两个实体,如果一个实体包含一个引用属性,另一个实体包含一个集合 ...

  6. nginx的location、rewrite玩法详解

      1. location正则写法 一个示例: 1234567891011121314151617181920212223242526272829303132333435363738394041424 ...

  7. 数据库 | SQL语法优化方法及实例详解

    使用复合索引 如果经常执行如上查询,那么建立三个单独索引不如建立一个复合索引,因为三个单独索引通常数据库每次执行只能使用其中一个,虽然这样比不使用索引而进行全表扫描提高了很多效率,但使用复合索引因为索 ...

  8. nginx的location配置root、alias用法和区别

    root & alias区别root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上root的处理结果是:root路径 ...

  9. Nginx 的 Location 配置指令块

    最近一段时间在学习 Nginx ,以前一直对 Nginx 的 Location 配置很头大,最近终于弄出点眉目.总结如下:nginx 配置文件,自下到上分为三种层次分明的结构: |    http b ...

随机推荐

  1. cojs 简单的区间问题 解题报告

    新学了些弦图和区间图的新玩意,于是就想着出一道题目 其实这道题不用弦图和区间图的理论也是可以做的 首先考虑第一问,第一问是一个NOIP普及组水平的贪心 我们把区间按照右端点从小到大排序,之后从头到尾扫 ...

  2. 利用PhantomJS搭建Highcharts export服务

    利用PhantomJS搭建Highcharts export服务 一直在使用Highcharts做web图表的展示, 但是当发送定时的报表邮件的遇到了这个问题. 为了保证邮件图表和web页图表样式一致 ...

  3. PCL—低层次视觉—点云分割(基于凹凸性)

    1.图像分割的两条思路 场景分割时机器视觉中的重要任务,尤其对家庭机器人而言,优秀的场景分割算法是实现复杂功能的基础.但是大家搞了几十年也还没搞定——不是我说的,是接下来要介绍的这篇论文说的.图像分割 ...

  4. DoG 、Laplacian、图像金字塔详解

    DoG(Difference of Gaussian) DoG (Difference of Gaussian)是灰度图像增强和角点检测的方法,其做法较简单,证明较复杂,具体讲解如下: Differe ...

  5. JBPM4 常用表结构

    JBPM4 常用表结构 第一部分:表结构说明 Jbpm4 共有18张表,如下,其中红色的表为经常使用的表   一:资源库与运行时表结构 1.  JBPM4_DEPLOYMENT 流程定义表 2.  J ...

  6. BNU OJ 33691 / LA 4817 Calculator JAVA大数

    留着当个模板用,在BNU上AC,在LA上RE……可能是java的提交方式不同??? 数和运算符各开一个栈. 表达式从左到右扫一遍,将数存成大数,遇到数压在 数的栈,运算符压在 运算符的栈,每当遇到右括 ...

  7. MariaDB10.2.X-新特性1-支持分析函数

    前言:前段时间看到MariaDB10.2出测试版本了,心想有什么新特性玩玩,大家都知道MySQL不支持分析函数,但是MariaDB10.2.X支持分析函数了, 1.表结构 CREATE TABLE ` ...

  8. java面试和笔试大全 分类: 面试 2015-07-10 22:07 10人阅读 评论(0) 收藏

    2.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型 ...

  9. Word Properties <?ref:xdo000X?> - BIP Deskotop 11.119.00.0 (32-bit) with Office 2013 (32-bit) on Win 7 64-bit

    BIP Deskotop 11.119.00.0 (32-bit)Office 2013 (32-bit)Win 7 (64-bit)The current certification matrix ...

  10. Oracle 多实例如何通过EM进行访问-portlist.ini

    [root@redhat4 install]# pwd/u01/app/oracle/product/11.2.0/dbhome_1/install[root@redhat4 install]# mo ...