nginx rewrite指令

参考官方:rewrite指令
参考博客:linux Nginx配置篇rewrite模块参数详解

rewrite和location的功能有点相像,都能实现跳转,主要区别在于rewrite常用于同一域名内更改获取资源的路径,而location是对一类路径做控制访问和反向代理,可以proxy_pass到其他服务器,在此说明下rewrite和location的执行先后顺序:

1.执行server块中的rewrite;

2.执行location;

3.执行location中的rewrite;

如果其中某步url被重写,则重新循环执行2-3步,直到找到按该url可以访问的文件,循环次数不超过10。

rewrite模块包含的指令有break,if,return,rewrite,rewrite_log,set等,还有另外两个指令uninitialized_variable_warn和Internal Implementation,用的比较少,可能我还没理解他们的用途,在此不做说明。下面一一说明常用指令的用处和用法。

  1. break
参数项:break,用于停止执行rewrite模块的指令,但是其他模块不受影响。
配置位置:server,location,if

示例:

server {
        listen       80;
        server_name  localhost;
        #===== break && rewrite test =====
        #这里如果注释掉break,所有请求进来都是返回http200,this is breaktest...
        break;
        return 200 "this is breaktest...";
        location = /breaktest {
            break;
            return 200 $request_uri;
            proxy_pass http://192.168.88.38/other;
        }
        location / {
            return 200 $request_uri;
        }

测试链接:http://192.168.88.38/breaktest ,请求到达server块后,被break终止执行rewrite指令集,return属于rewrite模块指令集,所以return 200 “this is breaktest…”不会执行;因为没有返回结果,所以继续执行location匹配,请求匹配到location = /breaktest{}之后,break终止return 200 $request_uri,而proxy_pass属于ngx_http_proxy_module,仍会继续执行,反向代理后的新url匹配到location /{},因此最终返回结果为 http200,/other

  1. rewrite
该指令可以在server块或者location块中配置,其语法结构为:
语法: rewrite regex replacement [flag];
配置位置:server,location,if

■ regex,用于匹配URI的正则表达式。使用括号“()”标记要截取的内容。注意
rewrite接收到的URI不包含host地址。因此,regex不可能匹配到URI的host地址。

■ replacement,匹配成功后用于替换 URI 中被截取内容的字符串。默认情况下,如果该字符串是由“http://”或者“https://”开头的,则不会继续向下对URI 进行其他处理,而直接将重写后的URI返回给客户端。

■ flag,用来设置rewrtie对URI的处理行为,可以为以下标志中的一个:
● last,终止继续在本location块中处理接收到的URI,并将此处重写的URI作为一个新的URI,使用各location块进行处理。该标志将重写后的URI重新在server块中执行,为重写后的URI提供了转入到其他location块的机会。我们通过一个例子来加深理解:

1 location / {
2	rewrite ^(/myweb/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
3	rewrite ^(/myweb/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
4 }

# 如果某URI在第2行被匹配成功并处理,Nginx服务器不会继续使用第3行的配置匹配和处理新的URI,
# 而是让所有的location块重新匹配和处理新的URI。

● break,将此处重写的URI作为一个新的URI,在本块中继续进行处理。该标志将重写后的地址在当前的location块中执行,不会将新的URI转向到其他location块。看下面的例子:

1 location / {
2	rewrite ^(/myweb/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
3	rewrite ^(/myweb/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
4 }

# 如果某URI在第2行被匹配成功并处理,Nginx服务器将新的URI继续在该location块中使用第3行进行匹配和处理。
# 新的URI始终是在同一个loaction块中。

● redirect,将重写后的URI返回给客户端,状态代码为302,指明是临时重定向URI,主要用在replacement变量不是以“http://”或者“https://”开头的情况下。

● permanent,将重写后的URI返回给客户端,状态代码为301,指明是永久重定向URI。
在使用flag指令时,一定要注意各个标志之间的配合。我们再来回顾刚才学习break标志时的例子,对比last标志里的例子,如果我们将第二个例子中的break标志换成last标志,会发生什么情况呢?
细心的读者可能已经发现,在第二个例子中,location块的uri指令是“/myweb/”,而重写后的URI仍然是包含“/myweb/”的,如果使用last标志,重写后的URI还可能会被该location块匹配到,这样就形成了无限循环。
Nginx服务器遇到这样的情况,会尝试10次循环之后返回错误状态代码500。

  1. rewrite_log
语法:		rewrite_log on | off;
默认:		rewrite_log off;
出现位置t:	http, server, location, if

该指令配置是否开启URL重写日志的输出功能,默认设置为off。如果配置为开启(on),URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件中

  1. Rewrite 常用全局变量举例:
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值