代码之家  ›  专栏  ›  技术社区  ›  Frank Drebin

nginx:使用参数重写大量(2000多个)url

  •  3
  • Frank Drebin  · 技术社区  · 6 年前

    我必须迁移许多带有参数的URL,如下所示:

    /somepath/somearticle.html?p1=v1&p2=v2 --> /some-other-path-a
    

    以及不带参数的相同URL:

    /somepath/somearticle.html --> /some-other-path-b
    

    棘手的是,在新系统中,两个目标URL是完全不同的页面,而在旧系统中,参数只是指示默认情况下打开哪个选项卡。

    我尝试了不同的重写规则,但得出的结论是nginx重写不考虑参数。我找到了一种使用位置指令的方法,但使用2000多个位置指令感觉不对。

    有人知道如何优雅地完成这件事吗?值得注意的是,除了2000多条重定向之外,我还有另外200.000条(!)重定向。它们已经起作用了,因为它们相当简单。所以我想强调的是,性能应该是关键!

    1 回复  |  直到 6 年前
        1
  •  6
  •   Richard Smith    6 年前

    您无法匹配查询字符串(来自 ? 向前)英寸 location rewrite 表达式,因为它不是规范化URI的一部分。看见 this document 有关详细信息。

    整个URI在 $request_uri 参数使用 $请求uri 如果参数的发送顺序不一致,则可能会出现问题。


    要处理许多URI,请使用 map 指令,例如:

    map $request_uri $redirect {
        default 0;
        /somepath/somearticle.html?p1=v1&p2=v2  /some-other-path-a;
        /somepath/somearticle.html              /some-other-path-b;
    }
    
    server {
        ...
        if ($redirect) {
            return 301 $redirect;
        }
        ...
    }
    

    也可以在中使用正则表达式 地图 ,例如,如果URI还包含可选的不匹配参数。看见 this document 更多信息。