HAOJX

Nginx中HTTP请求的11个阶段之第二阶段和第四阶段---rewrite阶段

字数统计: 609阅读时长: 2 min
2018/10/10 Share

##说明

要说明的是 , 这个rewrite有2个 , 一个是server_rewrite , 一个是rewrite , 这个阶段是由http框架执行的 , 他们执行的阶段顺序是这样的: server_rewrite(第二阶段)------>find_config(第三阶段)----->rewrite(第四阶段) , 但是server_rewrite阶段和rewrite阶段用的都是同一个模块:rewrite模块

rewrite模块提供了以下指令:

return指令

1
2
3
4
5
6
Syntax:
return code [text];
return code URL;
return URL;
Default: —
Context: server, location, if

##error_page指令

1
2
3
Syntax:  error_page code ... [=[response]] uri;
Default: —
Context: http, server, location, if in location

例子

server与location块下是return之类有什么区别

server块下的return是第二阶段SERVER_REWRITE的之类 , 而且location下的return是第四阶段REWRITE下的 , 所以按照阶段来说的话 , 是server下的return先发挥作用

例子:

1
2
3
4
5
6
7
8
9
10
server {
server_name return.taohui.tech;
listen 8080;
root html/;
error_page 404 /403.html;
return 403;
location /{
return 404 "find nothing!";
}
}

这里直接返回是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
2
3
4
5
6
7
8
9
10
server {
server_name return.taohui.tech;
listen 8080;
root html/;
error_page 404 /403.html;
#return 403;
location /{
#return 404 "find nothing!";
}
}

我们先把server和location下的return指令注释掉, 那么返回的就是error_page的403页面

rewrite指令

1
2
3
Syntax:  rewrite regex replacement [flag];
Default: —
Context: server, location, if

将regex指定的url替换成replacement这个新 url

如果replacement以http或者https或者$schema开头 , 则返回302重定向

替换后的url根据flag处理

  • –last 用replacement这个新rul进行新的location匹配
  • –break 停止当前脚本指令执行
  • –redirect 返回302重定向
  • –permanent 返回301重定向

if指令

1
2
3
Syntax:  if (condition) { ... }
Default: —
Context: server, location

如果条件为真, 则执行大括号内的指令

表达式:

  • 检查变量是否为空或者为0 , 直接使用
  • 将变量与字符串做匹配 , 用= 或者!=
  • 将变量和正则表达式做匹配, 用~ (大小写敏感) 或者~*(大小写不敏感)
  • 检查文件是否存在 , 用-f或者!-f
  • 检查目录是否存在 , 用-d或者!-d
  • 检查文件 , 目录 , 或者软连接是否存储用-e或者!-e
  • 检查是否为可行性文件 , 用-x或者!-x
CATALOG
  1. 1. return指令
    1. 1.1. 例子
    2. 1.2. server与location块下是return之类有什么区别
    3. 1.3. return与error_page有什么关系和联系
  2. 2. rewrite指令
  3. 3. if指令