nginx重写参数

yb3bgrhw  于 5个月前  发布在  Nginx
关注(0)|答案(1)|浏览(51)

我有一个nginx负载均衡器处理一些后端服务器的http web请求。由于一些遗留的原因,后端服务器不能更改,发出请求的客户端也不能更改。http请求包含参数。我有一组特殊字符(区分大小写)例如S = [“Q”,“A”,“B”,“C”],这些可以在特定参数中以任何顺序出现(让我们称之为“foo”)任何次数。我想用每个字符的特定预定义字符串替换每个字符。假设Q被替换为qx,A被替换为ay,B被bz替换,C被cz替换。举个例子

http:/localhost:5000/part?foo=QhelloAWorldBearthCLondon

字符串
这应转变为:

http://localhost:5000/part?foo=qxhelloayWorldbzearthczLondon.


有没有一种方法可以通过从nginx重写来做到这一点?我只想转换foo参数,而其他参数不变。尝试了递归方法,但在10次更新后被拒绝,因为nginx不允许超过10次。

neskvpey

neskvpey1#

NginxMap可以级联,这意味着问题可以分解为可管理的部分。
没有一个解决方案会给你给予无限的转换次数,但是下面的解决方案是可扩展的,所以你可以设置一个合理的上限。
举例来说:

map $arg_foo $newfoo1 {
    ~^(?<a1>.*)A(?<a2>.*)A(?<a3>.*)A(?<a4>.*)$  ${a1}ax${a2}ax${a3}ax${a4};
    ~^(?<a1>.*)A(?<a2>.*)A(?<a3>.*)$            ${a1}ax${a2}ax${a3};
    ~^(?<a1>.*)A(?<a2>.*)$                      ${a1}ax${a2};
    default     $arg_foo;
}

map $newfoo1 $newfoo2 {
    ~^(?<b1>.*)B(?<b2>.*)B(?<b3>.*)B(?<b4>.*)$  ${b1}bx${b2}bx${b3}bx${b4};
    ~^(?<b1>.*)B(?<b2>.*)B(?<b3>.*)$            ${b1}bx${b2}bx${b3};
    ~^(?<b1>.*)B(?<b2>.*)$                      ${b1}bx${b2};
    default     $newfoo1;
}

map $newfoo2 $newfoo3 {
    ~^(?<c1>.*)C(?<c2>.*)C(?<c3>.*)C(?<c4>.*)$  ${c1}cx${c2}cx${c3}cx${c4};
    ~^(?<c1>.*)C(?<c2>.*)C(?<c3>.*)$            ${c1}cx${c2}cx${c3};
    ~^(?<c1>.*)C(?<c2>.*)$                      ${c1}cx${c2};
    default     $newfoo2;
}

map $newfoo3 $newfoo {
    ~^(?<d1>.*)Q(?<d2>.*)Q(?<d3>.*)Q(?<d4>.*)$  ${d1}qx${d2}qx${d3}qx${d4};
    ~^(?<d1>.*)Q(?<d2>.*)Q(?<d3>.*)$            ${d1}qx${d2}qx${d3};
    ~^(?<d1>.*)Q(?<d2>.*)$                      ${d1}qx${d2};
    default     $newfoo3;
}

map $args $newargs {
    default     $args;
    ~^(?<e1>(?:.+&|)foo=)[^&]+(?<e2>&.*)?$  $e1$newfoo$e2;
}

server {
    ...
    location /part {
        rewrite ^ $uri?$newargs? break;
        proxy_pass ...;
    }
}

字符串
从底部开始,第五个map用foo=y替换foo=x,而不改变任何其他参数(如果有的话)。这个map的值可以用来替换请求URL中的参数。在上面的例子中,我们使用rewrite.break。
其他的Map每个都替换一个或多个单一模式的出现。在这个例子中,出现的最大数量是三个,但是可以很容易地扩展到任何合理的数量。
用于Map和捕获的所有变量名称都应该是唯一的,以避免无意中混淆值。应避免数字捕获,因为在下一个正则表达式求值时,值会丢失。

相关问题