嵌套位置块中的指令继承

Directive Inheritance in Nested Location Blocks

下面两个nginx服务器块在语义上是相同的,还是有什么区别?第一个示例中的 JSON-specific 配置是否继承了“/”位置的设置?在第二个例子中是吗?

server {
  location / {
     # ...
     location ~* \.json$ {
          # json-specific settings
     }
  }
}

server {
  location / {
     # ...
  }
  location ~*  \.json$ {
    # json-specific settings
  }
}

Nginx 中配置指令的继承是这样的,指令只能从配置树上层的上下文继承,而不能从同一级别或更低级别的上下文继承。

因此,位置块不能从另一个位置块继承,但嵌套位置块可以从父位置块继承。

我强调可以,因为有许多不同类型的指令,并且每种指令的继承行为都有点不同。

  1. 有些标准类型指令只有一个值或一组 附加值。这些将简单地被较低的上下文继承 在配置树下或在较低的上下文中由新的替换 值。例如 "index".

  2. 数组类型指令,它在一个数组中传递多个单独的值 大批。这些将简单地被下层的上下文继承 配置树或在较低的上下文中被新值替换。 请注意,您不能添加到数组中。改变部分正在更换它 全部。一个例子是 "proxy_param"。所以如果你定义 proxy_param A 和 proxy_param B 在服务器级别,例如,然后尝试 在位置上下文中定义 proxy_param C,"A" 和 "B" 将是 消灭(设置为默认值)。定义 "C" 意味着 替换数组。

  3. Command Type Directives如"try_files"一般不用 完全继承了。

所以具体到你的问题,在一个位置块上下文中定义的指令不能像你的第二个例子那样被另一个继承。

父位置块中定义的标准和数组类型指令将由嵌套位置块继承。父类中定义的命令类型指令一般不会被继承。