如何防止 Nginx 重写规则在请求中编码"&"



遵循请求:

/service/data/packet/{|79A90E010D021211120511300003E40000000000000D900~5}&param1=1234&param2=12.64&param3=4&param4=6

需要翻译并路由为:

/path/to/file?pkt={|79A90E010D021211120511300003E40000000000000D900~5}&param1=1234&param2=12.64&param3=4&param4=6

我尝试了以下解决方案:

  1. rewrite /service/data/packet/?(.*)$ /path/to/file?pkt=$1? last;

这似乎在请求中将>& 编码为%26 ,这会破坏它。

  1. 我尝试将参数隔离并将其重写为路由URL,例如:

rewrite ^/service/data/packet/(.+)&param1=(.+)&param2=(.+)&param3=(.+)&param4=(.+) /path/to/file?pkt=$1&param1=$arg_param1&param2=$arg_param2&param3=$arg_param3&param4=$arg_param4;

nginx这里似乎无法识别$args_<param-name>,因此在请求中通过pkt=&param1=&param2=&param3=&param4=

有没有办法告诉nginx在第一种情况下传递请求之前不要编码该请求?我在这里缺少什么?

所以,我终于能够解决这个问题。第二个解决方法似乎可以进行一些修改,如下所示:

"^/service/data/packet/(.+)&param1=(.+)&param2=(.+)&param3=(.+)&param4=(.+)$" "/path/to/file?pkt=$1&param1=$2&param2=$3&param3=$4&param4=$5?";

  1. nginx将基于"捕获组"替换param变量,因此,对于所有请求参数,将正则必须在捕获组中;IE;封闭在"(("中。然后只能作为变量可用。

  2. 可以通过将重写规则包装在双引号中,如图所示。

  3. ,可以解决自动编码问题。

以来,在我的情况下,前两个参数的长度是固定的,可以将规则修改为更有效的形式,为:

"^/service/data/packet/(.{52})&param1=(.{15})&param2=(.+)&param3=(.+)&param4=(.+)$" "/path/to/file?pkt=$1&param1=$2&param2=$3&param3=$4&param4=$5?";

最新更新