nginx 重写在 url 末尾附加一个参数

nginx 重写在 url 末尾附加一个参数

我需要配置我的反向代理,以便在 URL 末尾添加以下参数:&locale=de-de

这几乎可行:

rewrite ^(.*)$ $1&locale=de-de break;

然而,问题是我需要附加'&locale = de-de'只有当它还不存在时如果网址中有“?”...

我可以得到一些帮助来制定正确的正则表达式来做到这一点吗?

另一个问题:如果我使用这个,为什么我的 url 中的问号不显示:
$uri?$args

或者 $uri$is_args$args 转换未编码的 url,问号显示为 %3f。

有想法吗?

编辑:似乎与 proxy_pass 结合使用时存在此行为。在简单的重写中,它确实运行良好。

答案1

  1. rewrite你匹配 URL 时小路部分。这意味着,$1将不包含查询字符串。
  2. 默认情况下,Nginx 将原始查询字符串附加到重写替换。

因此,可以安全地编写

rewrite ^(.*)$ $1?locale=de-de break;

如果您不希望 Nginx 附加原始查询字符串,只需?在替换 URL 末尾指定:

rewrite ^(.*)$ $1?locale=de-de? break;

答案2

匹配rewrite不包含查询参数,因此您需要在其他地方进行测试。

尝试:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}

答案3

不会rewrite修改请求参数,只会修改 URI 的路径部分。根据我的经验,重写会导致奇怪的循环,新参数会无限地附加。在 Nginx 中,重写可能不是实现此目的的方法。

相反,您应该$args使用set指令修改变量:

set $args $args&locale=de-de;

相关内容