nginx:用参数重写很多(2000+)个 url

Fra*_*bin 3 parameters redirect nginx url-rewriting

我必须使用参数迁移很多 URL,如下所示:

/somepath/somearticle.html?p1=v1&p2=v2 --> /some-other-path-a
Run Code Online (Sandbox Code Playgroud)

以及没有参数的相同 URL:

/somepath/somearticle.html --> /some-other-path-b
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ric*_*ith 6

您不能?在locationandrewrite表达式中匹配查询字符串(以后的任何内容),因为它不是规范化 URI 的一部分。有关详细信息,请参阅此文档。

整个 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;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

您还可以在 中使用正则表达式map,例如,如果 URI 还包含可选的不匹配参数。有关更多信息,请参阅此文档。