一、rewrite模块介绍(Nginx_http_rewrite_module)
nginx通过ngx_http_rewriet_module模块支持url重写、支持if条件判断,但不支持else。另外该模块需要PCRE支持,应该在编译nginx时指定PCRE支持。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可执行10次,超过后Nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下是有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。学习rewrite之前要对正则表达式很熟悉,以下列出一些常用的正则表达式元字符:
. :匹配除换行符以外的任意字符。
?:重复0次或1次
+ :重复1次或更多次
* :重复0次或更多次
\d:匹配数字
^ : 匹配字符串的开始字符
$ : 匹配字符串的结束字符
{n}:重复n次
{n,}:重复n次或更多次
[c] :匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
二、rewrite 重写中用到的指令
if(条件){} 设定条件,再进行重写
set# 设置变量
return # 返回状态码
break # 跳出rewrite
rewrite # 重写
三、指令介绍及实验测试
1. if 语法格式
if 空格 (条件){
重写模式
}
条件怎么写?
答:3种写法
1:“=”来判断相等,用于字符串比较
2: “~”用正则来匹配(此处的正则区分大小写)
“~*”不区分大小写的正则
3: -f -d -e 来判断是否为文件,为目录,是否存在
例子1:使用if 语句,禁止IP地址访问
location / {
if ($remote_addr = 192.168.40.1) {
return 403;
}
if ($http_user_agent ~ rv:11.0) {
rewrite ^.*$ /ie.html;
break; #(不break会循环重定向)
}
if (!-e $document_root$fastcgi_script_name) {
rewrite ^.*s /404.html break;
}
注:此处还要加break,
以xx.com/dsafsd.html这个不存在的页面为例,
因为我们观察访问日志,日志中显示的访问路径,依然是GET/dsafsd.html HTP/1.1
提示:服务器内部的rewrite和302跳转不一样。
跳转的话URL都变了,变成了重新http请求404.html,而内部rewrite,上下文没变,
就是说 fastcgi_script_name 仍然是dsafsd.html,因此,会循环重定向。
四、set用法
set是设置变量用的,可以用来达到多条件判断时作标志用。
达到Apache下的rewrite_condition的效果。
如果:判断IE并重写,且不用break:
if ($http_user_agent ~* rv:11.0) {
set $isie 1;
}
if ($fastcgi_script_name = ie.html) {
set $isie 0;
}
if ($isie = 1) {
rewrite ^.*$ ie.html;
}
原文地址:http://blog.51cto.com/5001660/2130506