Rewirte介绍

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perlcompatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,类似网络中的重定向

应用场景:

  1. URL看起来更规范、合理
  2. 企业会将动态URL地址伪装成静态地址提供服务
  3. 网址换新域名后,让旧的访问跳转到新的域名.上
  4. 服务端某些业务调整
  5. 常见搭配location、rewrite & if

ngx_http_rewrite_module 模块指令

关键指令rewrite(flag跳转redirect、permanent、代理break、last ) 

辅助指令if、set、break、return、

辅助指令

IF指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

if (条件匹配) {
action
}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:

Nginx Rewirte辅助指令详解和配置_Nginx

#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
#示例:
location / {
index index.html;
default_type text/html;
if ( $scheme = http ){
echo "if-----> $scheme";
}
if ( $scheme = https ){
echo "if ----> $scheme";
}
#if (-f $request_filename) {
# echo "$request_filename is exist";
#}
if (!-e $request_filename) {
echo "$request_filename is not exist";
#return 409;
}
}

各类测试先准备换环境

Nginx Rewirte辅助指令详解和配置_重定向_02

测试语法

Nginx Rewirte辅助指令详解和配置_rewrite_03

测试结果,原应该跳404的,if判断跳403成功

Nginx Rewirte辅助指令详解和配置_Nginx_04

SET指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。

location / {
root /data/nginx/html/pc;
index index.html;
default_type text/html;
set $name test;
echo $name;
set $my_port $server_port;
echo $my_port;
}

测试语法

Nginx Rewirte辅助指令详解和配置_重定向_05

测试结果,打印正常

Nginx Rewirte辅助指令详解和配置_rewrite_06

break指令

用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模块中指令(if&set&break&return)就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用

#示例
if ($slow) {
limit_rate 10k;
break;
}
location / {
root /data/nginx/html/pc;
index index.html;
default_type text/html;
set $name test;
echo $name;
break;
set $my_port $server_port; #set在rewrite模块,不在执行
echo $my_port; #echo不在rewrite模块,继续执,但由于13行不在执行,实际打印为空
}

return指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置

语法格式:

  • return code; #返回给客户端指定的HTTP状态码
  • return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
  • return code URL; #返回给客户端的URL地址
#示例
location / {
root /data/nginx/html/pc;
default_type text/html;
index index.html;
if ( $scheme = http ){
#return 666;
#return 666 "not allow http";
#return 301 http://www.baidu.com;
return 500 "service error";
echo "if-----> $scheme"; #return后面的将不再执行
}
if ( $scheme = https ){
echo "if ----> $scheme";
}
}

HTTP状态码

Nginx Rewirte辅助指令详解和配置_重定向_07

测试语法

Nginx Rewirte辅助指令详解和配置_rewrite_08

测试结果,从浏览器抓包看到跳转成功。如果用301测试,记得清除缓存

Nginx Rewirte辅助指令详解和配置_rewrite_09