在nginx

时间:2018-01-16 17:24:37

标签: nginx

预设:

我们需要将查询参数t = http://endpoint/:df01:/:df02:/:df03:/004.jpg替换为其他查询参数...?:df01:= 1&amp;:df02:= 13&amp;:df03:= 9我们正在传递请求。< / p>

结果:

将请求重定向到http://endpoint/1/13/9/004.jpg

到目前为止,通过执行以下规则,我们的nginx.conf中的规则运行良好:

    if ($args ~ "^rt=rt0010_01&.*&:df\d+:=(\d+)&:df\d+:=(\d+)&:df\d+:=(\d+)&t=(https?:\/\/.*)\/Newsletter\/.*\/.*\/.*\/(.*)") {
        set $location $4;
        set $params $2/$1/$3/$5;
        rewrite . $location/Newsletter/$params? redirect;
    }

我们的问题是我们不能动态地改变t = path中的参数,如t = http://endpoint/:df01:/:df03:/:df02:/004.jpg,因为params参数设置为&#34; hardcoded&#34; $ 2 / $ 1 / $ 3 / $ 5。

所以我的问题是,我是否可以构建某种重写规则来解析t =变量中的:dfxx:params然后将其替换为请求中提供的其他参数,或者我是否必须包含一些模块扩展名也许可以做这个工作? (顺便说一句,我们还必须在重写中解决硬编码/新闻稿,它仍然存在于由t = ... param提供的URL中。)

我被要求添加一个包含完整请求和相应响应的示例:

REQUEST:

http://nginx-srv.com/rd/?rt=rt0010_01&cid=609&:df01:=609&:df26:=02&:df08:=1&t=http://my.domain/Newsletter/:df26:/:df01:/:df08:/008.jpg

响应:

http://my.domain/Newsletter/02/609/1/008.jpg

我希望这已经足够了。

1 个答案:

答案 0 :(得分:1)

使用以下规则,您可以移动df参数,并且端点是可变的。

      if ($args ~ "(.*&?):(df\d\d):=(\d+)(&?.*/):\2:(/.*)" ) {
        set $args  $1$4$3$5;
      }
      if ($args ~ "(.*&?):(df\d\d):=(\d+)(&?.*/):\2:(/.*)" ) {
        set $args  $1$4$3$5;
      }
      if ($args ~ "(.*&?):(df\d\d):=(\d+)(&?.*/):\2:(/.*)" ) {
        set $args  $1$4$3$5;
      }
      if ( $args
           ~ "&?t=(https?:\/\/[^/]*/)([A-Za-z]*)(\/.*\/.*\/.*\/)([^&]*)&?" ) {
        set $rscheme $1;
        set $endpoint $2;
        set $arguments $3;
        set $image $4;
      }
      rewrite . $rscheme$endpoint$arguments$image? redirect;
      return 301;

带参数

的网址
:df01:=1&:df02:=13&:df03:=9&t=http://my.domain/Newsletter/:df01:/:df02:/:df03:/004.jpg

被重写为

http://my.domain/Newsletter/1/13/9/004.jpg

带参数

:df02:=13&:df01:=1&:df03:=9&t=http://your.domain/Letternews/:df02:/:df03:/:df01:/lookatme.jpg

它被重定向到

http://your.domain/Letternews/13/9/1/lookatme.jpg