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
实际上可能不存在,因此我需要处理这些情况。下面是一些应该如何重写的例子:
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= 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。
我有一个像这样的 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= 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。