根据要求:
/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 ,这会破坏它。
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在第一种情况下传递请求之前不要对请求进行编码?我在这里缺少什么?
答案 0 :(得分:0)
所以,我终于能够解决这个问题了。第二种解决方法似乎可以进行一些修改,如下所示:
"^/service/data/packet/(.+)¶m1=(.+)¶m2=(.+)¶m3=(.+)¶m4=(.+)$" "/path/to/file?pkt=$1¶m1=$2¶m2=$3¶m3=$4¶m4=$5?";
Nginx将基于“捕获组”替换参数变量,因此,对于所有请求参数,正则表达式必须位于捕获组中;即;括在“()”里面。然后只有它可用作变量。
自动编码问题可以通过将重写规则包含在双引号中来处理,如图所示。
因为在我的情况下,前两个参数的长度是固定的,所以可以将规则修改为更有效的形式:
"^/service/data/packet/(.{52})¶m1=(.{15})¶m2=(.+)¶m3=(.+)¶m4=(.+)$" "/path/to/file?pkt=$1¶m1=$2¶m2=$3¶m3=$4¶m4=$5?";