url重写是指通过配置conf文件,以让网站的url中达到某种状态时则定向/跳转到某个规则,比如常见的伪静态、301重定向、浏览器定向等。
Rewrite功能的实现是依赖于PCRE(perl兼容的正则表达式)的支持,所以在编译安装Nginx之前,需要安装PCRE库
Rewrite模块语法
1.set指令
用来设置新的变量 语法: set $variable value; 比如 set $id 3; #设置id为3
2.if指令
语法为if(condition){…} #对给定的条件condition进行判断。 a:当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false,其他情况为true。 b:直接比较变量和内容时,使用 = 或!= c:正则表达式匹配:使用~(区分大小写)和~*(不区分大小写),取反运算!~ 和!~*
。 注意:使用正则表达式字符串一般不需要加引号,但是如果含有右花括号“}”或者分号“;”字符时,必须要给整个正则表达式加引号
其他指令:
-f和!-f用来判断请求文件是否存在
-d和!-d用来判断请求目录是否存在
-e和!-e用来判断请求的文件或者目录否存在
-x和!-x用来判断请求的文件是否可执行
例子:if (-f $request_filename){
… #判断请求的文件是否存在,存在就执行这里面的代码块
}
3.return指令
该指令用于完成对请求的处理,直接向客户端响应状态的代码。和Java中的return语法类似。可以再server块和location以及if块中使用。 语法: return code; #code表示状态码 或者:return URL: #返回的URL必须包含“http://”、“https://”或者直接使用“$scheme”变量(RequestScheme代表传输协议,Nginx内置变量)。没有状态码的URL将被视为一个302状态码。 或者:return [text]; #为返回给客户端的响应体内容,支持变量的使用
4.rewrite指令
该指令通过正则表达式的使用来改变URI.可以同时存在一个或者多个指令,按照顺序一次对URL进行匹配和处理。该指令可以在server块或location块中配置
语法:rewrite regex replacement [flag];
rewrite是实现URL重定向的重要指令,
regex:用来匹配URI的正则表达式;
replacement:匹配成功后用来替换URI中被截取内容的字符串,默认情况如果该字符串包含"http://"、"https://"开头,则不会继续向下对URI进行其他处理。直接返回重写的URI给客户端
flag:用来设置rewrite对URI的处理行为.
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
重写示例
1.域名跳转
server {
listen 80;
server_name abc.com;
rewrite ^/(.*) http://www.abc.com/$1 permanent; # 跳转到www.abc.com网址上
}
2.防盗链
location ~* .(gif|jpg|png|swf|flv)$ {
#none:表示无Referer值的情况。blocked:表示Referer值被防火墙进行伪装。server_names:表示一个或多个主机名称
valid_referers none blocked www.vison.com www.wsvison.com;
#这里表示Referer头域中的值是none或者blocked或者后面这些网址才会返回去正常的gif|jpg|png|swf|flv文件,否则执行下面if块代码
if ($invalid_referer) { #匹配成功为0 ,没有匹配成功为1
return 404;
}
}