Regex nginx使用map重定向多个URL

Regex nginx使用map重定向多个URL,regex,nginx,Regex,Nginx,我正试图用map指令将一堆旧的url重定向到新的url中。我可以做简单的,但有点卡在那些查询参数 我需要这样做 /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\?pers

我正试图用map指令将一堆旧的url重定向到新的url中。我可以做简单的,但有点卡在那些查询参数

我需要这样做

/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
}

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

map $request_uri $redirect {
    default                          0;
    ~^/people.php\?personid=(\d+)^    /people/$1;
    ...
}

server {
    ...
    if ($redirect) {
        set $args '';
        return 301 $redirect;
    }

我已将
personid=
之后的捕获组限制为数字:
\d+
解决此问题的常用方法如下所示:

map $request_uri $redirect {
    default                          0;
    ~^/people.php\?personid=(\d+)^    /people/$1;
    ...
}

server {
    ...
    if ($redirect) {
        set $args '';
        return 301 $redirect;
    }

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

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

您可以改为使用
return
语句:

if ($redirected_uri) {
    return 301 $redirected_uri;
} 
或者更好的是,在
映射中使用命名捕获:

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

还要注意的是,Nginx uri以一个前导的
/
开始,您有一个未scaped的
,正则表达式结尾的正确锚点是
$
一旦计算另一个正则表达式,数值捕获就会超出范围,因此,
rewrite
语句本身从上一个
map
语句中擦除
$1
的值

您可以改为使用
return
语句:

if ($redirected_uri) {
    return 301 $redirected_uri;
} 
或者更好的是,在
映射中使用命名捕获:

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


还要注意的是,Nginx uri以一个前导的
/
开头,您有一个未开槽的
,正则表达式结尾的正确锚点是
$

如何在
服务器
块中使用此
映射
替换?@IvanShatsky刚刚将该代码添加到问题中,第二部分不需要使用
映射
。试试:
rewrite^/people/(.*)$/people.php?personId=$1 last
@RichardSmith我之所以使用map,是因为有50多个这样的URL。好吧,你不能使用
$1
(见下面我的答案)您需要将
if
块放在
location/
块内,以避免重定向循环。如何在
服务器
块内使用此
map
替换?@IvanShatsky刚刚将该代码添加到第二部分不需要使用
map
的问题中。试试:
rewrite^/people/(.*)$/people.php?personId=$1 last
@RichardSmith我使用map是因为有50多个这样的URL。你不能使用
$1
(见下面的答案),你需要将
if
块放在
location/
块中以避免重定向循环。是的,它似乎也发送了querystring-我如何删除它?我是这样写的```if($redirected_uri){rewrite^$redirected_uri permanent;}```/people.php?personid=20改为/people/20?personid=20-我不想添加查询字符串。似乎没有帮助。如果我添加一个,是否还有其他内容?最后,Nginx不会添加querystring…即使这对我来说似乎也不起作用。是的,它似乎也会发送querystring-如何删除它?我是这样写的```if($redirected_uri){rewrite^$redirected_uri permanent;}```/people.php?personid=20改为/people/20?personid=20-我不想添加查询字符串。似乎没有帮助。如果我添加一个,是否还有其他内容?最后,Nginx不会添加querystring…即使这对我来说似乎也不管用。这很管用,谢谢!我还需要做相反的,请看修改后的问题。你能帮个忙吗?有没有办法重命名参数,例如~^/people\.php\?personid=(?*)$/people?id=$personid这似乎不起作用。是否可以进行多个命名捕获(如问题中的第三个URL)是的,例如:
~^/info\.php\?name=(?[^&]+)&age=(?\d+)/person/$name/$age是否有办法使查询参数的顺序无关紧要?e、 在上面的例子中,年龄可以在名字之前。这很有效,谢谢!我还需要做相反的,请看修改后的问题。你能帮个忙吗?有没有办法重命名参数,例如~^/people\.php\?personid=(?*)$/people?id=$personid这似乎不起作用。是否可以进行多个命名捕获(如问题中的第三个URL)是的,例如:
~^/info\.php\?name=(?[^&]+)&age=(?\d+)/person/$name/$age是否有办法使查询参数的顺序无关紧要?e、 g.在上述示例中,年龄可以在名称之前。