【问题标题】:nginx redirect multiple URLs with mapnginx 使用地图重定向多个 URL
【发布时间】:2020-06-18 21:46:39
【问题描述】:

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

【问题讨论】:

  • 如何在 server 块中使用这个 map 替换?
  • @IvanShatsky 刚刚将该代码添加到问题中
  • 第二部分不需要使用map。试试看:rewrite ^/people/(.*)$ /people.php?personId=$1 last;
  • @RichardSmith 我正在使用地图,因为有超过 50 个这样的网址。
  • 好吧,你不能使用$1(见下面我的回答),你需要将if块放在location /块内以避免重定向循环。

标签: regex nginx


【解决方案1】:

只要计算另一个正则表达式,数字捕获就会超出范围,因此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 以 / 开头,. 未转义,正则表达式结尾的正确锚点是 $

【讨论】:

  • 行得通,谢谢!我还需要做相反的事情,请参阅修改后的问题。你能帮忙吗?
  • 无论如何要重命名参数,例如~^/people\.php\?personid=(?.*)$ /people?id=$personid 这似乎不起作用。
  • 是否可以进行多个命名捕获(例如我在问题中的第三个 URL)
  • 可以,例如:~^/info\.php\?name=(?&lt;name&gt;[^&amp;]+)&amp;age=(?&lt;age&gt;\d+) /person/$name/$age;
  • 有没有办法让查询参数的顺序无关紧要?例如在上面的例子中,年龄可以在名字之前。
【解决方案2】:

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

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

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

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

【讨论】:

  • 是的,它似乎也发送了查询字符串 - 我该如何删除它?我有这样的``` if ($redirected_uri) { rewrite ^ $redirected_uri Permanent; } ```
  • /people.php?personid=20 更改为 /people/20?personid=20 - 我不想添加查询字符串。
  • 似乎没有帮助。如果我添加一个,是否还有其他内容?最后,Nginx 不会添加查询字符串......即使这似乎对我不起作用。
猜你喜欢
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2015-03-14
  • 2016-10-17
相关资源
最近更新 更多