我必须使用params迁移大量的URL,如下所示:
/somepath/somearticle.html --> /some-other-path-b
以及没有params的相同网址:
,
棘手的部分是两个目标网址在新系统中是完全不同的页面,而在旧系统中,参数只是指示默认打开哪个标签。
我尝试了不同的重写规则,但得出的结论是nginx重写不考虑参数。我找到了一种使用位置指令的方法,但是有2000多个位置指令只是感觉不对。
有人知道如何完成这项工作的优雅方式吗?值得注意的是,除了那些2000多个重定向,我还有另外200.000(!)重定向。他们已经工作了,因为他们相当简单。所以我想强调的是性能应该是关键!
答案 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。