遵循请求:
/service/data/packet/{|79A90E010D021211120511300003E40000000000000D900~5}¶m1=1234¶m2=12.64¶m3=4¶m4=6
需要翻译并路由为:
/path/to/file?pkt={|79A90E010D021211120511300003E40000000000000D900~5}¶m1=1234¶m2=12.64¶m3=4¶m4=6
我尝试了以下解决方案:
-
rewrite /service/data/packet/?(.*)$ /path/to/file?pkt=$1? last;
这似乎在请求中将>& 编码为%26 ,这会破坏它。
- 我尝试将参数隔离并将其重写为路由URL,例如:
rewrite ^/service/data/packet/(.+)¶m1=(.+)¶m2=(.+)¶m3=(.+)¶m4=(.+) /path/to/file?pkt=$1¶m1=$arg_param1¶m2=$arg_param2¶m3=$arg_param3¶m4=$arg_param4;
nginx这里似乎无法识别$args_<param-name>
,因此在请求中通过pkt=¶m1=¶m2=¶m3=¶m4=
。
有没有办法告诉nginx在第一种情况下传递请求之前不要编码该请求?我在这里缺少什么?
所以,我终于能够解决这个问题。第二个解决方法似乎可以进行一些修改,如下所示:
"^/service/data/packet/(.+)¶m1=(.+)¶m2=(.+)¶m3=(.+)¶m4=(.+)$" "/path/to/file?pkt=$1¶m1=$2¶m2=$3¶m3=$4¶m4=$5?";
-
nginx将基于"捕获组"替换param变量,因此,对于所有请求参数,将正则必须在捕获组中;IE;封闭在"(("中。然后只能作为变量可用。
-
可以通过将重写规则包装在双引号中,如图所示。
,可以解决自动编码问题。
以来,在我的情况下,前两个参数的长度是固定的,可以将规则修改为更有效的形式,为:
"^/service/data/packet/(.{52})¶m1=(.{15})¶m2=(.+)¶m3=(.+)¶m4=(.+)$" "/path/to/file?pkt=$1¶m1=$2¶m2=$3¶m3=$4¶m4=$5?";