灵活应用 Nginx Rewrite:实战经验与实用方法
Nginx Rewrite 顺序优先级
具体而言,当 Nginx 匹配请求 URL 时,先按照完全匹配(location =)进行匹配,然后是完整路径匹配(location 完整路径),接着是路径前缀匹配(location ^~ 路径),再然后是正则表达式匹配(location ~,~* 正则顺序),最后是部分起始路径匹配(location 部分起始路径),如果都没有匹配成功,则使用 / 作为默认匹配。
Nginx Rewrite Flag
Nginx Rewrite 指令中的 flag 用于控制重写操作的行为,常见的 flag 有以下几种:
last:相当于 Apache 中的 [L] 标记,表示完成重写操作,并跳过后续的 Rewrite 指令,直接选择下一个匹配的 location 进行处理。
break:终止当前匹配,不再执行后续的 Rewrite 指令,并使用当前重写后的 URL 进行请求处理。
redirect:返回 302 临时重定向,地址栏会显示跳转后的 URL,对搜索引擎爬虫来说不会更新 URL(因为是临时重定向)。
permanent:返回 301 永久重定向,地址栏会显示跳转后的 URL,对搜索引擎爬虫来说会更新 URL(因为是永久重定向)。
last 和 break 在使用上区别:
last 和 break 当出现在 location 块之外时:
last 和 break 当出现在 location 块内部时
例子
如下 Nginx 配置,回答下面 3 个问题
1 当 1 这条 rewrite 规则生效后, 2,3,4 规则将会如何处理。
2 当 5 这个 rewrite 指令处理完成之后,将会如何处理请求。
3 第二个 location 中的 rewrite(6)指令处理完成之后,将会如何处理请求。
当 1 这条 rewrite 规则生效后, 它后面的 2,3,4 将被跳过不做判断, 而去直接选择 后面的 location.
当 5 这个 rewrite 指令处理完成之后, 会跳出 location, 再重新判断 rewrite 1-4 的规则.
第二个 location 中的 rewrite(6)指令处理完成之后, 不会跳出 location, 更不会重新判断 rewrite 1 ~ 4 的规则. 而只能将信息传递给后面的 fastcgi_pass 或者 proxy_pass 等指令。
Nginx 请求匹配到下面的 localtion 会返回 404 吗
根据 Nginx 的请求处理过程,当执行了 return 指令时,后续的 rewrite 和 return 指令不会执行,而是将其扔给了 fastcgi_pass 或者是 proxy_pass 指令去处理,而不会执行"return 404;"。因此,配置中的"return 404;"不会被执行。
版权声明: 本文为 InfoQ 作者【小毛驴的烂笔头】的原创文章。
原文链接:【http://xie.infoq.cn/article/ab7033bda954ab0f70dc5a9a2】。文章转载请联系作者。
评论