预设:
我们需要将查询参数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://my.domain/Newsletter/02/609/1/008.jpg
我希望这已经足够了。
答案 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