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