Regex nginx使用map重定向多个URL
我正试图用map指令将一堆旧的url重定向到新的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
/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.在上述示例中,年龄可以在名称之前。