我有一个类似这样的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;
}
}
注意:如果有帮助,这是一个单页应用程序。
答案 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。