rewrite模块

230 阅读3分钟

一、return指令

return指令是rewrite模块中的指令,而rewrite指令出现的地方有两个:一个是server rewrite,一个是location rewrite。

也就是说rewrite中的return指令可以出现再server模块中,也可以出现在location模块中,比如:

server {
    return 301 'server';
    location {
       return 403 'location';
       ....
   }
   ...
}

return会将请求的响应返回,所以后面所有的指令就不会被执行。

return指令的值有:

二、相关状态码

  • 444:立刻关闭链接,不会向用户返回响应。

  • 301:永久性重定向。

  • 302:临时重定向,禁止被缓存。

  • 303:临时重定向,允许改变请求方法,禁止被缓存。

  • 307:临时冲定向,不允许改变请求方法,禁止被缓存。

  • 308:永久性冲定向,不允许改变请求方法。

三、return和error_page

error_page指令不是rewrite模块的指令,但是它和return指令很相似,这里我来做一个对比。

1、error_page指令

error_page指令的使用为:error_page code ......  [[=response]] uri;

2、使用案例

  • error_page 404 /404.html

  • error_page 400 =200 /404.html,这里=200的意思是虽然没有找到文件,但是返回给用户的状态码还是200

  • error_page 404 =@fallback,@fallback为一个location

  • error_page 404 x.threatbook.cn/

  • error_page 404 =200 x.threatbook.cn/

3、error_page的执行阶段

其实error_page没有执行阶段,它是集成到http框架中的指令,不属于任何阶段。

4、error_page与return指令的对比

情况1:

server {
    error_page 404 /404.html;
    return 200 '404'

}

直接返回return内容。

情况2:

server {
    error_page 404 /404.html;
    return 200 '404'

}

直接返回return内容。

情况3:

server {
    error_page 404 /404.html;    location /test/ {
        return 200 'test';
     }
}

直接返回return内容。

总结:接收请求时,不管error_page和return的位置如何变化,都返回return的内容。当上游服务器返回404、500等触发error_page时,会执行error_page。

四、rewrite指令

1、介绍

rewrite指令用于修改请求的url,它的用法为:rewrite regex replacement [falg]。regex为正则表达式,replacement为要要替换成的url,flag指示行为。

  • 在该正则表达式中,可以使用(?)来匹配部分内容,使用$domain来获取匹配到内容。

  • 当replacement为https://、http://、$schema开头的,直接返回302重定向。

  • flag可选的值:

  • --last:使用replacement重新匹配location。

  • --break:停止当前指令的执行,继续向下执行,break指令的作用相同,但是break指令在if中。

  • --redirect:返回302重定向。

  • --permanent:返回301重定向。

2、案例

  •   server {
          location /first/ {
              rewrite /first(.*) /second$1 last;
              return 200 'first';
          }
      
          location /second/ {
              rewrite /second(.*) /third$1 break;
              return 200 'second';
          }
           location /third/ {
              return 200 'third';
          }}
    

使用http://localhost/first/text.html,返回的内容为200 'secod'。

五、if指令

if指令能够让我们根据变量的值,判断是否执行某些操作。使用方法:

if (condition) {
    ......
}

表达式的条件为:

  • 检查变量为空,或者值是否为0, 直接使用。

  • 将变量和字符串做对比,使用=或者!=。

  • 将变量和正则表达式做匹配。

  • 大小写敏感,~或者!~。

  • 大小写不敏感,~*或者!~*。

  • 检查文件是否存在,使用-f或者!-f。

  • 检查目录是否存在,使用-d或者!-d。

  • 检查文件、目录、软连接是否存在,使用-e或者!-e。

  • 检查是否为可执行文件,使用-x或者!-x。