##说明
要说明的是 , 这个rewrite有2个 , 一个是server_rewrite , 一个是rewrite , 这个阶段是由http框架执行的 , 他们执行的阶段顺序是这样的: server_rewrite(第二阶段)------>find_config(第三阶段)----->rewrite(第四阶段)
, 但是server_rewrite阶段和rewrite阶段用的都是同一个模块:rewrite模块
rewrite模块提供了以下指令:
return指令
1 | Syntax: |
##error_page指令
1 | Syntax: error_page code ... [=[response]] uri; |
例子
server与location块下是return之类有什么区别
server块下的return是第二阶段SERVER_REWRITE的之类 , 而且location下的return是第四阶段REWRITE下的 , 所以按照阶段来说的话 , 是server下的return先发挥作用
例子:
1 | server { |
这里直接返回是server下是return , 即403 , 如果把server下的return 403;
注释掉的话, 那么返回的就是:”find nothing!” , 即location下的return
return与error_page有什么关系和联系
如果server和location都没有return , 那么error_page就会发挥作用 , 但是在server和location中任意中加了retrun指令 , 那么error_page就没有机会发挥作用 了 , 因为return指令是在第二阶段发挥作用的,return要优于error_page发挥作用
看下面例子:
1 | server { |
我们先把server和location下的return指令注释掉, 那么返回的就是error_page的403页面
rewrite指令
1 | Syntax: rewrite regex replacement [flag]; |
将regex指定的url替换成replacement这个新 url
如果replacement以http或者https或者$schema开头 , 则返回302重定向
替换后的url根据flag处理
- –last 用replacement这个新rul进行新的location匹配
- –break 停止当前脚本指令执行
- –redirect 返回302重定向
- –permanent 返回301重定向
if指令
1 | Syntax: if (condition) { ... } |
如果条件为真, 则执行大括号内的指令
表达式:
- 检查变量是否为空或者为0 , 直接使用
- 将变量与字符串做匹配 , 用
=
或者!=
- 将变量和正则表达式做匹配, 用
~
(大小写敏感) 或者~*
(大小写不敏感) - 检查文件是否存在 , 用
-f
或者!-f
- 检查目录是否存在 , 用
-d
或者!-d
- 检查文件 , 目录 , 或者软连接是否存储用
-e
或者!-e
- 检查是否为可行性文件 , 用
-x
或者!-x