rewrite 规则常与if条件判定结合使用
方式①
示例
location [匹配模式] [pattern_str]{
if ([判定模式] [uri]){
rewrite [src] [dst] [last|break|redirect|permanent];
}
}
判定模式
-f
和!-f
:用来判定后面uri内的文件是否存在-d
和!-d
:用来判定后面uri内的目录是否存在-e
和!-e
:用来判定后面uri内的文件或目录是否存在-x
和!-x
:用来判定后面uri内的文件是否可执行
方式②
示例
location [匹配模式] [pattern_str]{
if ($variable_name){
rewrite [src] [dst] [last|break|redirect|permanent];
}
}
变量
- 设置变量的规则
set $variable_name [value];
- 当变量的value为空或为0时,此时if判定条件为假为”false”.无法进入if语句块执行里面的语句。
- 当为其他值时,执行语句块内的规则。
方式③
示例
location [匹配模式] [pattern_str]{
if ($variable_name ~ [pattern_string]){
rewrite [src] [dst] [last|break|redirect|permanent];
}
}
说明
- 此方式利用正则
- 若后面的正则表达式能够匹配到前面的变量的值,则为”true”;否则为”false”
rewrite [src] [dst] [last|break|redirect|permanent];
- rewrite将src重定向到dst,并显示dst的内容
- src与dst中皆可使用正则表达式,且在src中使用
()
后,可以按照使用的顺序 利用$1,$2,,,将前面括起来的内容在dst中使用。 - 如 rewrite ^/cjerrybird/post-(3).html /cjerrybird/post.php?id=$1
标记
- last: 终止location内的其他rewrite模块指令的执行,并使用dst进行新的location匹配。实现url重写,地址栏的url不变.(dst写相对路径,以/开头)
- break:终止location内的其他rewrite模块指令的执行,并继续执行不属于rewrite模块指令的其他指令。本条规则匹配完成后,终止匹配,不在匹配后面的规则。 实现url重写,地址栏的url不变(dst写相对路径,以/开头)
- redirect:返回302状态码 临时重定向。(dst写绝对路径,以http或https开头) 地址栏显示重定向后的url
- permanent:返回301状态码 永久重定向。(dst写绝对路径,以http或https开头 地址栏显示重定向后的url)
rewrite后面没有标记
- 没有任何标记则将顺序执行location内的rewrite指令
- 若rewrite指令执行完,没有rewrite指令可以执行
- 则将重新发起一轮location指令匹配
dst的说明
- 若dst中以
http:// https:// $scheme
开头,则停止处理后续指令,并直接重定向返回给客户端
指令执行顺序
- 首先顺序执行server块内的location块之外的rewrite模块指令,得到rewrite后的dst
- 然后循环执行如下指令:()
- 依据rewrite后的dst,匹配定义的location块
- 顺序执行匹配到的location块内的rewrite模块指令。
- 如果在某一步src被重定向到dst,则循环执行上述1-2,直到找到真实的文件;若循环超过10次,则返回500 Internal Server Error错误
rewrite模块指令包括哪些
- break指令
- if指令
- returen指令
- set指令
- rewrite指令
- rewrite_log指令
- uninitialized_variable_warn 指令
参考资料:官方:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
参考资料:https://segmentfault.com/a/1190000008102599
参考资料:https://imshusheng.com/linux/179.html
转载请注明:大魔王ISDevil's Blog » rewrite模块规则