Nginx:删除单个查询字符串参数

Wer*_*ner 4 nginx nginx-reverse-proxy

我有一个服务器,它返回一个包含 API 密钥的 301 HTTP 重定向 URL。重定向命中 Nginx,在那里我需要添加一个Authorization包含 API 密钥值的HTTP 标头。然后我想从发送的查询参数中删除 API 密钥

我需要翻译/google/?search=abcde&apikey=1234&version=1/google/?search=abcde&version=1

代码

location /google/ {
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    Host                $http_host;
    proxy_set_header    Authorization       "Bearer $arg_apikey";
    proxy_pass          https://google.com/;
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下操作,但不起作用: 删除 nginx 重写中的参数

location /google/ {
    if ($query_string ~ "^(.*)apikey=(.*)$") {
       rewrite ^(.*)$ $uri? permanent;
    }
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    Host                $http_host;
    proxy_set_header    Authorization       "Bearer $arg_apikey";
    proxy_pass          https://google.com/;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Ric*_*ith 6

一种解决方案是将正则表达式应用于$request_uri变量(其中包含包含查询字符串的原始请求)并捕获要删除的参数之前和之后的所有内容。

例如:

map $request_uri $newuri {
    default                                   $request_uri;
    ~^(?<prefix>.*)apikey=[^&]+(?<suffix>.*)$ $prefix$suffix;
}
server {
    ...
    location /google/ {
        resolver ...;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    Host                $http_host;
        proxy_set_header    Authorization       "Bearer $arg_apikey";
        proxy_pass          https://google.com$newuri;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

您可能可以使用if块获得类似的结果。在此示例中,proxy_pass语句是使用map变量构造的。有关详细信息,请参阅此文档

resolver由于proxy_pass语句中的变量,您可能需要定义 a 。有关详细信息,请参阅此文档