添加一个参数到nginxredirect,只要它还没有被定义

我使用nginx根据他们的位置redirect用户。 我只想添加一个参数到查询string,只要该参数尚未定义 – 如果它被定义,我不想改变它。 这个参数被称为tag

这是我第一次尝试。 我希望它会落在第二个位置,如果它在任何地方的URL中都有tag= string,如果它有一个查询string,但是丢失了tag ,则会落到第三个位置,如果没有查询string,则会落到第一个位置。

 location / { return 302 https://$local_site$request_uri?tag=mytag; } location /tag=/g { return 302 https://$local_site$request_uri; } location /\?/ { return 302 http://$local_site$request_uri&tag=mytag; } 

然后我知道,当按位置钻取时你看不到查询string。 而且我也知道如果是邪恶的话

有没有办法做到这一点,而不使用?

nginx location条目只匹配URL的URI部分,而不匹配查询string。 你可以通过map来实现你正在寻找的东西。 以下需要在http块中:

编辑:我原来的答案有重复tag条目在结果url中的问题。 原来的解决scheme是在post的末尾,这是一个固定的版本

 map $args $newargs { default $args&tag=mytag; ~ ^(.*)(tag=[^&]+)(.*)$ $1$2$3; } 

然后你会有以下的location块:

 location / { rewrite (.*) $1?$newargs temporary; } 

我们使用mapfunction从$argsvariables中定义$newargs ,其中包含URL中的查询string。 默认选项是将&tag=mytag附加到string。

如果查询string包含tag=something string,那么我们只需将查询string复制到一个新的请求。

最后,我们使用$newargsvariables作为rewrite目标中的查询string。

这是原来的答案:

 map $arg_tag $tag { default $arg_tag; ~ ^$ mytag; } 

然后你会有以下的location块:

 location / { return 302 https://$local_site$request_uri?tag=$tag; } 

在这里,我们首先从tag查询参数映射到$tagvariables。 第一行将缺省值设置为查询参数值。 第二行testing参数是否为空,如果是则将$mytag设置为值。

然后你可以在任何地方使用$tagvariables,像你所描述的那样映射值。

基本上if应该避免,但这并不意味着你不能使用它。

 location / { if ($arg_tag) { return 302 https://$local_site$request_uri; } rewrite ^(.*) https://$local_site$1?tag=mytag; }