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

时间:2019-06-13 12:32:33

标签: nginx nginx-location nginx-config

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

  • https://example.org/v2?product=lifesum-> https://example.org?version=v2&product=lifesum
  • https://example.org?product=lifesum-> https://example.org?product=lifesum
  • https://example.org/v13/foo/bar?product=lifesum-> https://example.org/foo/bar?version=v13&product=lifesum
  • https://example.org/v1113-> https://example.org?version=v1113
  • https://example.org-> https://example.org

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

# 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=$1 break;
        }

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

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

1 个答案:

答案 0 :(得分:1)

要满足所有要求,您将需要捕获URI中版本字符串后面的那一部分。

例如:

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

redirect标志使Nginx使用状态为302的外部重定向(有关详细信息,请参见this document)。要使SPA看到新的URI,必须进行外部重定向。

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

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

port_in_redirect off;

有关详细信息,请参见this document