Nginx 删除 URL 路径并将其作为查询参数

Nginx remove URL path and place it as a query parameter

我有一个像这样的 URL:https://example.org/v2?product=lifesum,我需要将其重写为:https://example.org?version=v2&product=lifesum。 URL 可能有更多或更少的查询参数,所以我需要保留所有这些。此外,/v2 实际上可能不存在,因此我需要处理这些情况。下面是一些应该如何重写的例子:

以下是我到目前为止尝试过的方法,但没有用:

# HTTP Server
    server {
        # port to listen on. Can also be set to an IP:PORT
        listen 8080;

        # This is my attempt to match and rewrite
        location ~* (\/v\d+) {
            rewrite (\/v\d+) /?api_version= break;
        }

        location = / {
            # I have also tried this rewrite but iit is not working either
            rewrite (\/v\d+) /?api_version= break;
            try_files $uri $uri/ /index.html;
        }
    }

注意:如果有帮助,这是一个单页应用程序。

为了满足您的所有要求,您需要捕获版本字符串后面的 URI 部分。

例如:

rewrite ^/(v\d+)(?:/(.*))?$ /?version= redirect;

redirect 标志导致 Nginx 使用具有 302 状态的外部重定向(有关详细信息,请参阅 this document)。 SPA 需要外部重定向才能看到新的 URI。

rewrite语句可以放在外server块中,也可以放在与原始URI匹配的location块中(例如:location ~* ^/v\d)。

要避免 Nginx 将端口号添加到重定向的 URI,请使用:

port_in_redirect off;

详情见this document