rewrite作用
rewrite语法中可以使用nginx提供的全局变量和自定义变量,可以对过来的请求进行判断和处理,实现对url的重写和重定向。
有的同志说,直接让它跳转向自己的接口不就行了吗,为什么非要多此一举。
使用rewrite可以隐藏真实的接口路径,花里胡哨。
使用范围
一般放在下边三个域内使用:
server{}。
location{}。
if{}。
rewrite和location区别
二者都有跳转url的作用。
rewrite一般在server里边,进行跳转,即在一个域名下。
location可以代理到其他的IP,其他的端口。
二者的执行顺序(被server监听到后):
1、执行server中的rewrite。
2、执行location匹配。
3、执行location中的rewrite。
如果某一步url被重写,则重复执行1-3顺序,知道找到应去的真实路径。
如果一直没有被重写,则按照正常顺序执行。
看一个例子:
http://www.xiaolaoben.com/api/route/exgx.action?userId=001
rewrite只对/api/route/exgx.action重写。
rewrite表达式只对域名后边的除去传递的参数外的字符串起作用。
将一个url分为前中后三部分,rewrite只对中间进行重写。
所以说rewrite是同一个域名内的跳转,而location可以跳转向其他IP。
rewrite语法
格式
rewrite regex replacement [flag].
rewrite '^/words/([a-z]{3})/([a-z]{2})/(.*)/.(doc|docx)$' /data?fileName=$3.$4 last;
regex
正则表达式,比较难写的,写的时候看看文档。
^ :正则表达式的开始。
$ :正则表达式的结束。
小括号里面的内容,第一个小括号,第二个小括号,第三个小括号分别由$1,$2,$3来表示。
比如来的请求url:/words/abc/ab/laoben.docx
正则匹配通过,就会修改为:/data?fileName=laoben.docx,然后进行location匹配。
replacement
要替换的url内容。
将前边的路径,修改为replacement的内容。
flag
last: 停止rewrite检测,发起新的location匹配。
break: 停止rewrite检测,不发起新的location匹配。
redirect: 返回302临时重定向。
permanent: 返回301永久重定向。
last和break要慎用,小心导致死循环。
一般情况下:
server和if内使用last,重写后的url直接进行location匹配,直到找到应去路径,最多匹配10次,否则返回500。
location内使用break,重写后的url不进行location匹配,终止rewrite语句,执行该location内非rewrite指令集,别继续匹配来匹配去了,往下走。
···················································································
rewrite规则挺复杂的,你品,你细品。
参考地址: