美文网首页
04_nginx之rewrite

04_nginx之rewrite

作者: 对方不想理你并向你抛出一个异常 | 来源:发表于2017-10-19 15:59 被阅读0次

rewrite 重写

重写中用到的指令

if  (条件) {}  设定条件,再进行重写 
set #设置变量
return #返回状态码 
break #跳出rewrite
rewrite #重写

If  语法格式
If 空格 (条件) {
    重写模式
}

条件又怎么写?

  • 3种写法

    • 1: “=”来判断相等, 用于字符串比较
    • 2: “~” 用正则来匹配(此处的正则区分大小写)
      ~* 不区分大小写的正则
    • 3: -f -d -e来判断是否为文件,为目录,是否存在.
  • 判断是192.168.175.1的ip就禁止访问

        location / {
            if ($remote_addr = 192.168.175.1) {
                return 403;
            }
            root   html;
            index  index.html index.htm;
        }
  • 判断浏览器
        location / {
            if ($http_user_agent ~ Chrome){
                rewrite ^.*$ /chrome.html;
                break;
            }
            root   html;
            index  index.html index.htm;
        }

注意:break是为了防止循环重定向

chrome浏览器访问
IE浏览器访问
  • 判断文件是否存在,不存在的话重定向到404.html
location / {
            if (!-e $document_root$fastcgi_script_name){
                rewrite ^.*$ /404.html;
            }
            root   html;
            index  index.html index.htm;
        }
没有break,报错
location / {
            if (!-e $document_root$fastcgi_script_name){
                rewrite ^.*$ /404.html;
                break;
            }
            root   html;
            index  index.html index.htm;
        }
重定向到404

注意:此处还要加break,以 http://z.com/abc.html这个不存在页面为例,我们观察访问日志, 日志中显示的访问路径,依然是GET /abc.html HTTP/1.1
提示: 服务器内部的rewrite和302跳转不一样,跳转的话URL都变了,变成重新http请求404.html, 而内部rewrite, 上下文没变,就是说 fastcgi_script_name 仍然是 abc.html,因此 会循环重定向。

  • 使用set设置变量,省略掉break的写法
            if ($http_user_agent ~* msie) {
                set $isie 1;
            }

            if ($fastcgi_script_name = ie.html) {
                set $isie 0;
            }

            if ($isie 1) {
                rewrite ^.*$ ie.html;
            }

商城URL重写

Goods-3.html ---->Goods.php?goods_id=3
goods-([\d]+)\.html ---> goods.php?goods_id =$1

location /ecshop {
index index.php;
rewrite goods-([\d]+)\.html$ /ecshop/goods.php?id=$1;
rewrite article-([\d]+)\.html$ /ecshop/article.php?id=$1;
rewrite category-(\d+)-b(\d+)\.html /ecshop/category.php?id=$1&brand=$2;

rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5;

rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d+\.])-(\d+)-([^-]+)-([^-]+)\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8;
}

注意:用url重写时, 正则里如果有”{}”,正则要用双引号包起来

相关文章

网友评论

      本文标题:04_nginx之rewrite

      本文链接:https://www.haomeiwen.com/subject/vupwyxtx.html