天天看点

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

为什么要将两个放在一起学习?

因为这两个是配置文件中使用正则表达式最多的指令。

location规则

nginx的http配置主要包括三个区块,如下图所示

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

http配置

location指令

通过指定的模式与客户端请求的URI进行匹配。主要的格式如下:

location [=|~|~*|^~|@] pattern {......}
           

1、直接匹配。这种没有修饰符,直接匹配URI。

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

直接匹配

2、使用=表示。这种是精确匹配。(注意等号与后面的URI有空格。)

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

使用=表示

3、使用~表示。**指定后面的正则表达式(pattern)要区分大小写

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

使用~表示

4、使用~*表示。指定后面的正则表达式(pattern)不区分大小写

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

使用~*表示

5、使用^~表示。一旦匹配后就停止搜索其他模式。

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

使用^~表示。

6、使用@表示。这种可以看做是“普通location”和“正则location”之外的第三种模式,它不是用来处理普通的HTTP 请求的,它是专门用来处理“内部重定向(internally redirected )”请求的。注意:这里说的“内部重定向(internally redirected )”或许说成“forward ”会好点,以为内internally redirected 是不需要跟浏览器交互的,纯粹是服务端的一个转发行为。

location修饰符的优先级

  1. 带有“=“的精确匹配优先
  2. 没有修饰符的精确匹配
  3. 正则表达式按照他们在配置文件中定义的顺序
  4. 带有“^~”修饰符的,开头匹配
  5. 带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
  6. 没有修饰符的,如果指定字符串与URI开头匹配
nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

location修饰符的优先级

rewrite模块

nginx 的重写模块是一个简单的正则表达式匹配与一个虚拟堆叠机结合。依赖于 pcre库,因此需要安装 pcre。根据相关变量重定向和选择不同的配置,从一个 location 跳转到另一个 location,不过这样的循环最多可以执行10 次,超过后 nginx 将返回 500 错误。同时,重写模块包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他 location、记录做了什么等等。

rewrite模块指令

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

break:完成当前设置的重写规则,停止执行其他的重写规则。

if:尽量考虑使用 trp_files 代替。它的判断条件有如下值:

  1. 一个变量的名称:空字符串”“或者一些“0”开始的字符串为 false。
  2. 字符串比较:使用=或!=运算符
  3. 正则表达式匹配:使用~(区分大小写)和~(不区分大小写),取反运算!~和!~。
  4. 文件是否存在:使用-f 和!-f 操作符
  5. 目录是否存在:使用-d 和!-d 操作符
  6. 文件、目录、符号链接是否存在:使用-e 和!-e 操作符
  7. 文件是否可执行:使用-x 和!-x 操作符

return:停止处理并为客户端返回状态码。非标准的 444 状态码将关闭连接,不发送任何响应头。可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416 与 500-504。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个 URL,该 URL 将成为 location 头补值。没有状态码的 URL 将被视为一个 302状态码。

rewrite:按照相关的正则表达式与字符串修改 URI,指令按照在配置文件中出现的顺序执行。可以在重写指令后面添加标记。注意:如果替换的字符串以 http://开头,请求将被重定向,并且不再执行多余的 rewrite 指令。

尾部的标记(flag)可以是以下的值:

  • last – 停止处理重写模块指令,之后搜索 location 与更改后的 URI 匹配。
  • break – 完成重写指令。
  • redirect – 返回 302 临时重定向,如果替换字段用 http://开头则被使用。
  • permanent – 返回 301 永久重定向。

rewrite_log:启用时将在 error log 中记录 notice 级别的重写日志。

set:为给定的变量设置一个特定值。

uninitialized_variable_warn:控制是否记录未初始化变量的警告信息。

nginx location匹配优先级_nginx的location规则与rewrite解析location规则location指令location修饰符的优先级rewrite模块rewrite模块指令

rewrite示例