V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hitsmaxft
V2EX  ›  程序员

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

  •  
  •   hitsmaxft ·
    hitsmaxft · 2015-04-18 21:38:14 +08:00 · 3964 次点击
    这是一个创建于 3289 天前的主题,其中的信息可能已经有所发展或是发生改变。
    链接: http://blog.bhe.me/blog/2015/04/18/routing-with-nginx-basic-rewrite-directives/

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

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

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

    加上map就涉及到变量了,所以这篇文章不涉及
    ryd994
        3
    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
        4
    hitsmaxft  
    OP
       2015-04-19 10:54:09 +08:00 via iPhone
    @ryd994 例子是为了说明行为上的区别,配置本身是没有意义的,不过你说的是,要是照搬就误人了,我待会改掉。

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

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

    至于更复杂的方案我这边不得不引入lua解决。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   908 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:58 · PVG 04:58 · LAX 13:58 · JFK 16:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.