rewrite知多少
首先mark两个博客:
1,nginx rewrite 指令last break区别最详细的解释
2,Nginx中的rewrite指令(break,last,redirect,permanent)
我的理解:
rewrite可以在server里面,也可以在server里的location里,
其中,在server里的rewrite和location,是先执行rewrite,再匹配location,无论二者位置如何。
last 会以重写后的结果发起新的请求,再次匹配location。
break 是本次重写后,即进入nginx的下一个阶段,产生数据输出的阶段。
如果一个location中有多个rewrite,last是第一次匹配到正则后,就结束在本location中的匹配,即这个location的last个匹配
,然后重写的结果还是会走其他的location;而break是结束所有的location的匹配,即break 出nginx的rewrite阶段
,进入下一个阶段,nginx有11个阶段。为了更可控,我们一般采用break。
除了常见的break和last,还有redirect和permanent
location的匹配规则
location [=|~|~*|^~] /uri/ { … }
- = 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求,是阻止正则的
- ~ 区分大小写匹配(可用正则表达式)
- ~* 不区分大小写匹配(可用正则表达式)
- !~ 区分大小写不匹配
- !~* 不区分大小写不匹配
- ^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 不使用正则表达式
匹配优先级:
1.匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个匹配的正则表达式将停止搜索。
2.一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。