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

时间:2018-02-14 07:04:01

标签: nginx url-rewriting

根据要求:

/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;
  2. 这似乎会在请求中将& 编码为%26 ,这会破坏它。

    1. 我尝试隔离参数并将其重写为路由网址,如:
    2. 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在第一种情况下传递请求之前不要对请求进行编码?我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

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

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

  1. Nginx将基于“捕获组”替换参数变量,因此,对于所有请求参数,正则表达式必须位于捕获组中;即;括在“()”里面。然后只有它可用作变量。

  2. 自动编码问题可以通过将重写规则包含在双引号中来处理,如图所示。

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

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