nginx中的rewrite指令

黎小强
2021-01-28 / 0 评论 / 706 阅读 / 正在检测是否收录...

rewrite功能

根据指定正则表达式匹配规则,重写URL

语法结构

语法 : rewrite regex replacement [flag]
默认值 : - 
上下文 ; server 、 location 、 if

示例

rewrite /images/(.*\.jpg)$ /pic/$1; //将/images下的*.jpg图片重写到/pic目录下的图片

这个$1 可以理解为 www.xxx.com/images/1.jpg 把这个1.jpg 参数传递到pic/目录下 ,查看pic/下是否有1.jpg

rewrite中的flag

flag可选值以及含义

1.jpg

这里重点看lastbreak的可选值。


场景示例

场景1

server {
    location /search {
        rewrite ^/(.*) http://www.baidu.com redirect;   //访问xxx.com/search 任意字符 会临时重定向到百度上。 
    }
}

场景2

流程顺序比较复杂,多看看。

访问xxx.com/images 重写到/pic下,/pic下又重写到/photos下。

写入测试数据

cd '网站目录'
mkdir imgages
mkdir pic
mkdir photos

echo "我在images目录下" > images/index.html
echo "我在pic目录下" > pic/index.html
echo "我在photos目录下" > photos/index.html
server {
    location /images {
        rewrite /images/(.*)$ /pic/$1;
    }
    
    location /pic {
         rewrite /pic/(.*) /photos/$1
    }
    
    location /photos {
        
    }
}

想想最后是会访问到那个?

答: 最后是会访问到photos下。一层一层匹配到最后的photos目录下。

(再次说明 这个$1 就是一个参数变量,访问xxx.com/images/index.html),实际上这个index.html 就是变量。最后重写到/photos/index.html

2.jpg

场景3

还是拿上述举例。如果在/pic的location段后,增加break 的flag。会重定向哪里?

server {
    location /images {
        rewrite /images/(.*)$ /pic/$1 break;    //增加break的flag,终止需要匹配规则
    }
    
    location /pic {
         rewrite /pic/(.*) /photos/$1;
    }
    
    location /photos {
        
    }
}

访问xxx.com/images 匹配到/pic,并且终止循环匹配去找。而直接去找pic下的文件,如果有就返回。就中止继续找了。

3.jpg

场景4

还是拿场景2举例。如果在/pic的location段后,增加last 的flag。会重定向哪里?

server {
    location /images {
        rewrite /images/(.*)$ /pic/$1 last;    //增加last的flag,重新在server段找
    }
    
    location /pic {
         rewrite /pic/(.*) /photos/$1;
    }
    
    location /photos {
        
    }
}

访问xxx.com/images,匹配到pic,加了last会在server段找是否有location /pic的内容,有就匹配。

匹配到了/pic 又重写到photos,最后还是访问photos目录下。

4.jpg

0

评论 (0)

取消