NGINX 重定向规则将路径转换为查询字符串

NGINX 重定向规则将路径转换为查询字符串

我们有一个现有的 IIS 应用程序,它与 Helicon APE 一起运行,使用现有的 Apache 规则重写 URL。这是一个例子:

RewriteRule ^/webapp/([^/]*)/([^/]*)(/.+)? /webapp/$4?$2=$3 [NC,L,P,QSA]

对于这些规则,原始 URL 类似于/webapp/f6/3/gx/1/default.htm将被转换为/default.htm?f6=3&gx=1。这支持 APE 中可变数量的中间路径(显然 Apache 中也是如此)。

由于 APE 扩展性不佳且会在负载下崩溃,我已经开始设置一个 NGINX,它将执行重写并为后端的 IIS 服务器执行负载平衡。

不过,我发现一个问题:nginx 重写的相同规则不能以相同的方式工作;我必须对其进行转换才能使其匹配:

rewrite ^/webapp/(.*)/([^/]+).htm /webapp/$2?$1;

事实上,这是为了/webapp/f6/3/gx/1/default.htm回报/webapp/default.htm?f6/3/gx/1

我一直在尝试找到一种使 nginx 将路径元素转换/x/y/g/z为查询字符串对的方法?x=y&g=z。Apache 似乎可以自动完成此操作,而 nginx 则不能,并且在文档或此站点或 StackOverflow 的其他问题中找不到任何内容。

显然使用 map 可以做到这一点,但找不到具体用法,而且我不是 nginx 专家,无法做到这一点。任何帮助或指示。都会受到欢迎。

答案1

如果正确构建了重写规则,它将变为递归,并在每次迭代中查询参数,直到所有路径元素都被使用。

例如:

rewrite ^(/webapp)/([^/]+)/([^/]+)(/.+)$ $1$4?$2=$3 redirect;

由于会rewrite自动附加现有的查询字符串,因此上述语句会在每次重定向时对其进行扩展。

rewrite...last通过在块内放置语句,可以使用内部重定向来实现相同的技巧location

这个文件了解更多信息。

相关内容