Nginx 使用查询字符串重写映射

Nginx 使用查询字符串重写映射

我有一个很大的 rewrite-map.conf 文件,其中包含服务器的多个重定向,但是如果 URL 中存在查询字符串变量,则它不起作用。

例如我的 /etc/nginx/conf.d/redirect-map.conf 包含以下内容:

映射 $request_uri $redirect_uri {
/docs/oldurlone /documents/newurlone
/docs/oldurltwo /documents/newurltwo
/docs/oldurlthree /documents/newurlthree
}

在我的 nginx 服务器配置中,我有以下配置执行重定向

如果($redirect_uri){
返回302 $redirect_uri;
}

所以要https://example.com/docs/oldurlone很好地重定向到https://example.com/documents/newurlone

我的问题是,如果原始 url 也包含查询字符串,我希望它能够传递下去。

如果我输入:
https://example.com/docs/oldurlone/?affiliatenumber27&name=dave

然后我希望它传递到
https://example.com/documents/newurlone/?affiliatenumber27&name=dave

我感觉我需要在某处做一些正则表达式,但首先我不确定具体在哪里(例如,这需要进入哪个配置文件)。

如果有人能帮助我,那就太好了。

答案1

根据 NGINX 文档,$request_uri 确实包含查询字符串:http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri

因此,您需要在将其传递到地图之前将其剥离:

map $request_uri $request_uri_path {
  "~^(?P<path>[^?]*)(\?.*)?$"  $path;
}

然后您可以按如下方式使用您的地图:

map $request_uri_path $redirect_uri {
/docs/oldurlone /documents/newurlone
/docs/oldurltwo /documents/newurltwo
/docs/oldurlthree /documents/newurlthree
}

看看https://stackoverflow.com/a/43749234/1246870用于剥离参数片段。

答案2

您应该尝试以下操作:

if ( $redirect_uri ) {
    return 302 $redirect_uri$is_args$args;
}

如果当地图具有额外的查询参数时它没有捕获请求 URI,那么您需要使用命名正则表达式捕获它并将其推送到$redirect_uri,就像这样(我相信):

map $request_uri $redirect_uri {
    /docs/oldurlone(?<query>.*)$ /documents/newurlone$query
    /docs/oldurltwo(?<query>.*)$ /documents/newurltwo$query
    /docs/oldurlthree(?<query>.*)$ /documents/newurlthree$query
}

相关内容