在Nginx重定向中重命名参数

时间:2019-03-05 13:34:11

标签: nginx

我正在尝试进行NGINX重定向以将我带离:

https://example.com/ui/?outletID=123&setID=456

收件人:

https://example.com/ui/?outletId=123&setIds=456

所以outletID-> outletIdsetID-> setIds

重要:我不知道这些参数在URL中出现的位置,因此在它们之前或之后可能还有其他字符串。我只关心这些替换:outletID -> outletId; setID -> setIds

首先尝试该方法:

if ($args ~* "^outletID=(\d+)&setID=(\d+)(.*)") {
    set $outletid $1;
    set $setid $2;
    set $everythingelse $3;
    set $args '';
    rewrite ^.*$ /ui/?outletId=$outletid&setIds=$setid$everythingelse permanent;
}

但这似乎是一种非常糟糕的做法,我尤其讨厌最终得到的$everythingelse ($3)解决方案。

2 个答案:

答案 0 :(得分:1)

要涵盖所有可能性,您可能需要分两个阶段执行此操作:如果存在outletID,则进行一个重定向;如果存在setID,则进行另一个重定向。

例如:

if ($args ~ ^(.+&|)outletID(=.*)$) {
    return 301 "$uri?${1}outletId$2";
}
if ($args ~ ^(.+&|)setID(=.*)$) {
    return 301 "$uri?${1}setIds$2";
}

答案 1 :(得分:1)

Nginx documentation

  

如果替换字符串包含新的请求参数,则   先前的请求参数将附加在它们之后。

因此,如果您不介意老outletIDsetID闲逛,您可以这样做:

rewrite (.*) $1?outletId=$arg_outletID&setIds=$arg_setID permanent;

这样,您会得到类似https://example.com/ui/?outletId=123&setIds=456&outletID=123&setID=456的信息。


但是,如果您希望在重定向后清理URL,Nginx也可以满足您的要求。相同文档的摘录:

  

如果不希望这样,请在替换字符串的末尾添加一个问号,以免将其附加在后面

这意味着,您必须枚举需要传递的所有参数。例如,如果查询字符串session中还有其他可能的参数,则需要将其包括在内:

rewrite (.*) $1?outletId=$arg_outletID&setIds=$arg_setID&session=$arg_session? permanent;

注意在替换字符串末尾的?


我个人会选择第一种方法,因为它不易出错,并且在添加新参数时不会意外破坏应用程序。