一、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;

                    }