我们有一个现有的 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
。
看这个文件了解更多信息。