
我們有一個現有的 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
。
看這個文件了解更多。