我有一个很大的 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
}