1. rewrite介绍
rewrite的主要功能是实现url地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。
重写中用到的指令:
-
if (条件) {}
判断条件,再进行重写 -
set
设置变量 -
return
返回状态码 -
break
跳出rewrite -
rewrite
重写
下面分别详细介绍一下这几条命令的具体用法:
-
if 指令
(1) 语法格式:
if 空格 (条件) {
重写模式
}
(2) 条件又怎么写? 大概有3种写法:
- “=”来判断相等, 用于字符串比较
- “~” 用正则来匹配(此处的正则区分大小写)
~* 不区分大小写的正则 - -f (判断请求的文件是否存在);
-d (请求的目录是否存在) ;
-e (文件或目录是否存在) ;
-x (文件是否可执行)。
例子:
# 如果请求的ip是192.168.1.100,直接返回403
if ($remote_addr = 192.168.1.100) {
return 403;
}
# 如果代理中包含MSIE,重定向到it.html
if ($http_user_agent ~ MSIE) {
rewrite ^.*$ /ie.htm break; #没有break会循环重定向
}
if (!-e $document_root$fastcgi_script_name) {
rewrite ^.*$ /404.html break;
}
#注, 此处还要加break
-
return指令
该指令用于完成对请求的处理,直接向客户端返回响应状态码。处于该指令后的所有nginx配置都将无效。可以在server块和location块以及if块中使用,语法结构有如下几种:
-
return [ text ]
-
return code URL;
-
return URL;
其中,code为返回给客户端的HTTP状态码;text为返回给客户端的响应体内容,支持变量的使用;URL为返回给客户端的URL地址。 -
break指令
在nginx的同一作用域中,break前的指令配置生效,break后的指令配置无效。nginx配置在遇到break时,将回到上一层作用于继续向下读取配置。
location / {
if ($slow) {
set $id $1 #处于break前的配置生效
break;
limit_rate 10k; #处于break后的配置无效
}
... #处于break指令上一层作用于的其他配置有效
}
-
rewrite指令
rewrite语法格式及参数语法说明如下:
rewrite <regex> <replacement> [flag];
关键字 - 正则 - 替代内容 - flag标记
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
例子:
rewrite ^/(.*) http://www.czlun.com/$1 permanent;
说明:
- rewrite为固定关键字,表示开始进行rewrite匹配规则
- regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址
- replacement部分是
http://www.czlun.com/$1
其中,$1
是取自regex部分()里的内容。匹配成功后跳转到的URL。 - flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.czlun.com/$1 地址上
regex 常用正则表达式说明:
\
将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“$”则匹配“$”
^
匹配输入字符串的起始位置
$
匹配输入字符串的结束位置
*
匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+
匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o”
?
匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,"?"等效于"{0,1}"
.
匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式。
(pattern)
匹配括号内pattern并可以在后面获取对应的匹配,常用$0...$9
属性获取小括号中的匹配内容,要匹配圆括号字符需要\(Content\)
注意:用url重写时, 正则里如果有”{}”,正则要用双引号包起来
网友评论