云博(司云中)
Nginx的rewrite模块及其指令用法(一)

阅读量:(10) 您现在所在的位置: 首页 百宝箱 Linux Nginx的rewrite模块及其指令用法(一) 作者:SmartCloud(云中)
简介:学习Nginx的rewrite模块及其指令用法

一 前言

URL重写是网站为了实现个性化配置满足自己业务需要必须要做的事情,URL重写是通过Nginx的ngx_http_rewrite_module来实现。


二 rewrite模块包含的指令

1.return 指令

return指令作用是直接返回,停止后续的处理,其返回的类别有三种。分别为code+url, code+text, url。

例子:

server { 
     listen 127.0.0.1:8083; 
     server_name localhost; 
     location / { 
     return 200 "hello baby"; 
 } 

重启nginx

sudo ./nginx -s reload

curl测试

hello baby[syz@syz-x542un sbin]$ curl 127.0.0.1:8083
hello baby[syz@syz-x542un sbin]$ curl -i 127.0.0.1:8083
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Tue, 06 Apr 2021 02:10:30 GMT
Content-Type: application/octet-stream
Content-Length: 10
Connection: keep-alive

2. rewrite指令

rewrite指令使用的是正则表达式来匹配URL,然后重写URL,同时rewrite指令包含了四个标志位,分别为break,last, redirect, permanent。

rewrite的执行顺序:

​ 1)根据rewrite指令在server中出现的顺序逐个执行,确定该server级别的全部rewrite执行后得到的最终URL.

​ 2)循环执行以下步骤:

​ 1.根据URL来找到匹配的location

​ 2.按照rewrite指令在location级别下出现的顺序逐个执行

​ 3.如果上一步中对URL进行了重写,并且使用last标志位,那么重复执行第2步骤,最多重复执行10次

例子:

server { 
     listen    127.0.0.1:8081; 
     server_name  localhost; 

 location /first { 
   rewrite /first/(.*) /second/$1 last; 
   return 200 "hello first\n"; 
 } 

 location /second { 
   rewrite /second/(.*) /third/$1; 
   return 200 "hello second\n"; 
 } 

 location /third { 
   return 200 "hello third\n"; 
 }
 }

结果

[syz@syz-x542un sbin]$ curl http://127.0.0.1:8081/second/w.txt
hello second

rewrite执行流程分析:

1.首先请求http://127.0.0.1:8081/second/w.txt,按照顺序被第一个location匹配成功,然后执行rewrite进行url重写,重写后追加标志位

last。

2.接下来搜索与/second/$1相匹配的location,被第二个location捕获,然后进行rewrite重写,此时后面没有追加任何标志位,则执行到return处返回其后内容, hello second

PS:上述过程执行了两次rewrite,last标志位表示停止处理当前的ngx_http_rewrite_module的指令集,并开始搜索与更改后的url匹配的location。


如果我第二个location后增加break标志位,会是什么结果呢?

server {
        listen       127.0.0.1:8081;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /first {
            rewrite /first/(.*) /second/$1 last;
            return 200 "hello first\n";
        }

        location /second {
            rewrite /second/(.*) /third/$1 break;
            return 200 "hello second\n";
        }

        location /third {
            return 200 "hello third\n";
        }
}

测试结果:

[syz@syz-x542un sbin]$ curl http://127.0.0.1:8081/second/3.txt
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>

由于添加了break标志位,表示停止处理当前级别下的ngx_http_rewrite_module的指令集,于是并不会执行return,而是根据url去搜索对应文件下是否存在匹配的文件。因此现在我在/third文件中添加一个3.txt文件并写入内容,再来查看效果。

[syz@syz-x542un sbin]$ curl http://127.0.0.1:8081/second/3.txt
nihao, my name is thrid-3

点赞一波

0

    欢迎您游客

 小云标签


 网站统计:


笔记数: 总点赞量:

总访问量:   分类数目:

服务器:阿里云服务器