场景: 在使用nginx过程中,我们很多时候有重写的需求,例如有争对url的、有争对域名的、也有争对目录的等等,当然,争对参数的重写,我们也在很多场景下会用得到,我们今天来争对参数下的举个例子 --“nginx在指定url下获取其中的参数重写”,也就是对指定url类型中的参数,进行重写,下面一起来看看。
版本说明:
Tengine version: Tengine/2.3.2
nginx version: nginx/1.17.3
需求说明:
假设请求:https://www.test.cn/look/app.html?key=xxx&url=yyy 类似路径地址, 其中,链接地址中只有参数会变动;
重写要求:将类似以上带有 /look/app.html 链接的参数 如:?key=xxx&url=yyy 中的 key=xxx&url=yyy ,重写为 https://www.test.cn/think/?key=xxx&url=yyy ;
实现方式:
if ( $uri ~ "^/look/app.html*") {
rewrite ^/(.*)$ https://www.test.cn/think/$is_args$args?;
}
当然我们也可以直接重写到根域名下:
if ( $uri ~ "^/look/app.html*") {
rewrite ^/(.*)$ https://www.test.cn$is_args$args?;
}
遇到的问题:
按照官方的全局变量说明:$args 应该就直接可以获取到指定url的所有参数,但是我们在测试过程中发现, 使用:https://www.test.cn$args 或者https://www.test.cn?$args 并不能实现我们的需求, 而得到的结果是:参数在url后,重复了两(2)次 , 而使用 $is_args$args? 才能实现需求。
官方的相关解释:
$args : 如果请求的url中带有参数,例如https://www.test.cn?md=123 , 则 $args的值就是md=123 .
$is_args : 如果请求的url中带有参数,例如https://www.test.cn?md=123 , 则$is_args的值就是 ? , 如果没有参数$is_args的值就是 空字符串 .
结论: 这样就不难理解为什么我们前面的需求中需要使用 $is_args$args 来实现了。

