nginx使用map重定向多个URL



我正在尝试使用 map 指令将一堆旧 URL 重定向到新的 URls。我能够做简单的,但有点卡在带有查询参数的那些。

我需要这样做

/people.php?personid=20 -> /people/20
/events.php/eventid=20 -> /event/20
/info.php?name=john&age=20 -> /person/john/20

我有一个地图指令

map $request_uri $redirected_uri {
~^people.php?personid=(.*)^ /people/$1?;
}

但似乎不起作用。任何帮助将不胜感激。提前谢谢。

我的服务器块有此代码

if ($redirected_uri) {
rewrite  ^ $redirected_uri permanent;
}

另外,我也在尝试执行以下操作 将/people/20 重写回 people.php?personId=20 所以,为此,我有这个

map $request_uri $new_uri {
default 0
~^/people/(.*) /people.php?personId=$1;
}

然后在服务器块中

if ($new_uri) {
rewrite ^ $new_uri last; // this doesn't work, throws 404
}

一旦计算了另一个正则表达式,数值捕获就会超出范围,因此rewrite语句本身会擦除上一个map语句中的$1值。

您可以改用return语句:

if ($redirected_uri) {
return 301 $redirected_uri;
} 

或者更好的是,在map中使用命名捕获:

map $request_uri $redirected_uri {
~^/people.php?personid=(?<personid>.*)$ /people/$personid;
}

还要注意的是,Nginx URI以前导/开头,你有一个未转义的.,正则表达式结尾的正确锚点是$

解决此问题的常用方法如下所示:

map $request_uri $redirect {
default                          0;
~^/people.php?personid=(d+)^    /people/$1;
...
}
server {
...
if ($redirect) {
set $args '';
return 301 $redirect;
}

我将personid=后的捕获组限制为数字:d+

最新更新