nginx:使用参数重写一个LOT(2000+)的url

时间:2018-03-09 10:24:30

标签: redirect nginx parameters url-rewriting

我必须使用params迁移大量的URL,如下所示:

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

以及没有params的相同网址:

,

棘手的部分是两个目标网址在新系统中是完全不同的页面,而在旧系统中,参数只是指示默认打开哪个标签。

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

有人知道如何完成这项工作的优雅方式吗?值得注意的是,除了那些2000多个重定向,我还有另外200.000(!)重定向。他们已经工作了,因为他们相当简单。所以我想强调的是性能应该是关键!

1 个答案:

答案 0 :(得分:2)

您无法匹配?location表达式中的查询字符串(rewrite以后的任何内容),因为它不是规范化URI的一部分。有关详细信息,请参阅this document

整个URI在$request_uri参数中可用。如果参数不是以一致的顺序发送,则使用$request_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还包含可选的不匹配参数,您也可以在map中使用正则表达式。有关详情,请参阅this document