我正在尝试使用 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+