分享文章, Nginx 路由杂谈 - Rewrite 指令与重定向

2015-04-18 21:38:14 +08:00
 hitsmaxft
链接: http://blog.bhe.me/blog/2015/04/18/routing-with-nginx-basic-rewrite-directives/

最近做新旧版本应用的替换,花了好长时间整理 nginx 集群的配置和lua 脚本,攒了不少配置方面的笔记,顺便整理成博客,放出第一部分,基础的 rewrite 指令。

剩下还有使用 ngx_lua 和服务发现配合进行流量分配和负载均衡之类,有时间补上。
4103 次点击
所在节点    程序员
4 条回复
ryd994
2015-04-19 00:02:43 +08:00
自从有了location regex捕捉,map,和return之后,已经很少用rewrite了……
hitsmaxft
2015-04-19 09:49:58 +08:00
@ryd994 location的正则匹配只是扩大了匹配的方位,思路是不变的。可以说location的内容主要看后端服务的需要。

rewrite 指令更像是一种前置的整理过程,针对url进行内部重定向。

加上map就涉及到变量了,所以这篇文章不涉及
ryd994
2015-04-19 10:29:51 +08:00
@hitsmaxft
我说location是指可以在location里面直接捕捉变量,然后return 301就好,参考我在这里的回复: /t/184228 如果用一堆rewrite就不好吧。
用好map,return,和alias,能覆盖绝大多数rewrite的使用,而且更有效率,而且会更符合Nginx的设计:nginx configuration in general is declarative

另外,你文中使用了很多if——if is evil
比如:
location = error.html {
if ( $arg_test ~= "" ) {
rewrite /error.html /error-test.html break;
root /service/http/asset;
}
}
不应在if中使用非rewrite指令,否则会造成不确定的结果,在if里改root则更加……
那个rewrite用alias会更好,因为不必再搜索location

PS:IMHO,rewrite模块整个模块其实都有点反Nginx哲学。用的好的话很顺手,但backfire也不少,尽量少用
PPS:其实很多人用rewrite只是因为简单的rewrite只要一行。或者是apache带来的习惯,看看Nginx板块上有多少求翻译apache rewrite的就知道
hitsmaxft
2015-04-19 10:54:09 +08:00
@ryd994 例子是为了说明行为上的区别,配置本身是没有意义的,不过你说的是,要是照搬就误人了,我待会改掉。

本来也想把试着写写如何合理配置,不过话题太大了。结合map和alias后面文章里再试着加进去。

使用rewrite的初衷是不希望location 过于复杂。
如果只是纯粹的map替换是可以接受,但如果是改写旧的url这种脏乱差的事情。我倾向于rewrite解决

至于更复杂的方案我这边不得不引入lua解决。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/184626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX