作者 :魯斯蘭·雅庫舍夫
規則範本用於提供一種簡單的方法,讓你能為特定情境創建一個或多個重寫規則。 URL 重寫模組 2 包含多種規則範本,適用於一些常見使用情境。 除了這個 URL Rewrite Module UI 外,還提供了一個框架來插入自訂規則範本。 本教學將引導你如何使用隨 URL 重寫模組附帶的「反向代理」規則範本。 欲了解更多關於如何配置 IIS URL 重寫模組與 IIS 應用程式請求路由的反向代理,請參考「帶 URL 重寫 v2 的反向代理」及「應用程式請求路由」。
先決條件
此操作指南需要具備以下條件:
- IIS 7 或更新版本且已啟用 ASP.NET 角色服務;
- 安裝了 URL 重寫模組 2.0;
- 已安裝 IIS 應用程式請求路由。
建立範例網站
為了簡化起見,你在本攻略中將處理的反向代理情境會在單一伺服器上實作,IIS「預設網站」則作為反向代理網站與內容應用程式,分別託管在同一台伺服器上的獨立 IIS 網站。
要建立範例內容網站:
請在以下資料夾中建立一個名為「contentsite」的資料夾:
%SystemDrive%\inetpub\ folder.建立一個名為「contentsite」的 IIS 網站,指向對應的資料夾。
%SystemDrive%\inetpub\使用埠號 8081 來存取該網站。
您可以使用以下指令來建立這些網站:%windir%\System32\inetsrv\appcmd.exe add site /name:"contentsite" /bindings:http/*:8081: /physicalPath:"%SystemDrive%\inetpub\contentsite在以下資料夾中建立一個名為 default.aspx 的檔案:
%SystemDrive%\inetpub\contentsite複製以下 ASP.NET 標記,貼到檔案中,並儲存為default.aspx:
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Reverse Proxy Test Application</title> </head> <body> <h1>Reverse Proxy Test Page</h1> <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %></p> <p><a href="http://<%= Request.ServerVariables["HTTP_HOST"] + Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p> </body> </html>為了確保網站正常運作,請開啟網頁瀏覽並請求以下網址:
http://localhost:8081/default.aspx
使用反向代理範本產生入站與出站規則
「反向代理」規則範本可用來產生入站重寫規則,將 HTTP 請求代理至另一台伺服器。 範本也可以選擇性地建立一個外發重寫規則,修正 HTML 回應中連結 URL 中的主機名稱。 在本導覽中描述的範例中,代理伺服器主機名稱為 localhost ,內容伺服器的主機名稱為 localhost:8081。 內容伺服器上的網頁應用程式會在 HTML 回應中產生一個連結,該連結使用內部主機名稱,例如 http://localhost:8081/default.aspx。 出站規則將此連結固定為使用代理伺服器的主機名稱,例如 http://localhost/default.aspx。
使用規則範本建立規則,請遵循以下步驟:
- 在 IIS 管理員中,左側樹狀檢視中選擇「預設網站」。
- 開啟 URL 重寫功能檢視。
- 在 URL 重寫功能檢視中,選擇「新增規則......」動作,然後選擇「反向代理」範本:
- 在「新增反向代理規則」對話框中輸入以下內容:
HTTP 請求將被轉發的伺服器名稱或 IP 位址:localhost:8081
勾選「重寫 HTTP 回應中連結的網域名稱」勾選框並輸入:
來源: localhost:8081
收件人: localhost
- 按兩下 [確定]。 將同時建立入站與出站規則:
測試反向代理
為了測試由規則範本產生的重寫規則是否正確運作,請打開網頁瀏覽器並向 發出請求。http://localhost/default.aspx IIS「預設網站」會收到此請求,並依照入站重寫規則將其路由到 http://localhost:8081/default.aspx 。 當 HTTP 回應從 內容網站 回傳時,出站重寫規則會修改 HTML 內的連結 URL,將主機名稱從 localhost:8081 重寫為 localhost:
使用 ARR 反向代理來管理 Tomcat 伺服器
為了在 IIS + ARR 反向代理後架設 Tomcat 伺服器時加強防禦,可以使用 URL 重寫規則來減緩路徑穿越攻擊。 這些攻擊常利用 Tomcat 在 URL 區段中處理路徑參數的差異,例如 “/..;a=b/」,如 Apache Tomcat 安全考量中所述。
為什麼這很重要
Tomcat 對分號路徑參數的解讀與 IIS 不同,可能導致意外的穿越行為。 在 ARR 模組處理這些模式之前,先阻擋或正規化這些模式,有助於防止被利用。
如果你的目標只是阻擋包含穿越嘗試的請求(例如「/..;a=b/“),使用通配字或正規表達式語法。
萬用牌規則範例
<rule name="BlockDotDotWildcard" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
<match url="*/..;*/*" />
<action type="CustomResponse" statusCode="404" statusReason="Not Found" statusDescription="" />
</rule>
正則表達式規則範例
<rule name="BlockDotDotRegEx" stopProcessing="true">
<match url="\/\.\.;.*\/" />
<action type="CustomResponse" statusCode="404" statusReason="Not Found" statusDescription="" />
</rule>
重要注意
- 在端對端的環境中徹底測試。 你可能需要其他規則來處理編碼或雙重編碼的模式(例如,%252F..%253Bfoo%252F)。
- 規則順序很重要:確保阻擋規則先於 ARR 代理相關規則執行。
- 效能取捨:正則表達式提供彈性,但會產生較高的開銷。
進階情境:URL 重整化
如果你想移除路徑參數並重新標準化 URL,使所有 URL 重寫規則都適用於標準化後的 URL,你需要經過一次重定向循環。 例如:輸入:
/abc/..;boo/xyz/ 重定向至: /abc/../xyz/ →正規化為 /xyz/ →由重寫規則重新評估。
範例規則
<rule name="RenormalizeURL_SSL" stopProcessing="true">
<match url="^([^;]*)(;[^/]*)(/.*)$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTPS}" pattern="ON" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}{R:3}" redirectType="Found" />
</rule>
<rule name="RenormalizeURL" stopProcessing="true">
<match url="^([^;]*)(;[^/]*)(/.*)$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTPS}" pattern="OFF" />
</conditions>
<action type="Redirect" url="http://{HTTP_HOST}/{R:1}{R:3}" redirectType="Found" />
</rule>
當正則表達式變得過於複雜時
對於高度複雜的情況,可以考慮 撰寫自訂的 URL 重寫服務提供者。
總結
在這個教學中,你學會了如何使用「反向代理」規則範本來產生重寫規則,實現 IIS 中簡單的反向代理設定。 請使用此規則範本作為起點來產生基礎規則。 你可以稍後調整或修改這些規則,以符合網頁應用程式的特定路由與重寫需求。