为什么要将两个放在一起学习?
因为这两个是配置文件中使用正则表达式最多的指令。
location规则
nginx的http配置主要包括三个区块,如下图所示
http配置
location指令
通过指定的模式与客户端请求的URI进行匹配。主要的格式如下:
location [=|~|~*|^~|@] pattern { ...... }
1、直接匹配。这种没有修饰符,直接匹配URI。
直接匹配
2、使用=表示。这种是精确匹配。(注意等号与后面的URI有空格。)
使用=表示
3、使用~表示。**指定后面的正则表达式(pattern)要区分大小写
使用~表示
4、使用~*表示。指定后面的正则表达式(pattern)不区分大小写
使用~*表示
5、使用^~表示。一旦匹配后就停止搜索其他模式。
使用^~表示。
6、使用@表示。这种可以看做是“普通location”和“正则location”之外的第三种模式,它不是用来处理普通的HTTP 请求的,它是专门用来处理“内部重定向(internally redirected )”请求的。注意:这里说的“内部重定向(internally redirected )”或许说成“forward ”会好点,以为内internally redirected 是不需要跟浏览器交互的,纯粹是服务端的一个转发行为。
location修饰符的优先级
- 带有“=“的精确匹配优先
- 没有修饰符的精确匹配
- 正则表达式按照他们在配置文件中定义的顺序
- 带有“^~”修饰符的,开头匹配
- 带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
- 没有修饰符的,如果指定字符串与URI开头匹配
location修饰符的优先级
rewrite模块
nginx 的重写模块是一个简单的正则表达式匹配与一个虚拟堆叠机结合。依赖于 pcre库,因此需要安装 pcre。根据相关变量重定向和选择不同的配置,从一个 location 跳转到另一个 location,不过这样的循环最多可以执行10 次,超过后 nginx 将返回 500 错误。同时,重写模块包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他 location、记录做了什么等等。
rewrite模块指令
break:完成当前设置的重写规则,停止执行其他的重写规则。
if:尽量考虑使用 trp_files 代替。它的判断条件有如下值:
- 一个变量的名称:空字符串”“或者一些“0”开始的字符串为 false。
- 字符串比较:使用=或!=运算符
- 正则表达式匹配:使用~(区分大小写)和~(不区分大小写),取反运算!~和!~。
- 文件是否存在:使用-f 和!-f 操作符
- 目录是否存在:使用-d 和!-d 操作符
- 文件、目录、符号链接是否存在:使用-e 和!-e 操作符
- 文件是否可执行:使用-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:控制是否记录未初始化变量的警告信息。
rewrite示例