﻿# 如何利用 IIS7 的 ARR 模組實做 Reverse Proxy 機制

IIS7 的 **ARR** ( [Application Request Routing](https://learn.microsoft.com/en-us/iis/extensions/planning-for-arr/using-the-application-request-routing-module) ) 模組是個「**非常強悍**」的網站工具，今天抽空研究了一下，並成功設定 Reverse Proxy 機制，由於初學者要上手 [ARR](https://learn.microsoft.com/en-us/iis/extensions/planning-for-arr/using-the-application-request-routing-module) 真的有點困難，即便是對 Regular Expression 有經驗的 IT 人要成功設定都可能會遇到許多障礙，如果沒使用過 URL Rewrite 或不瞭解 [Reverse Proxy](http://en.wikipedia.org/wiki/Reverse_proxy) 的人要上手那可是難上加難，所以今天我就分享一篇完整的安裝、設定過程。

### 安裝 Application Request Routing 1.0 模組

1\. 使用 [Microsoft Web Platform Installer](http://www.microsoft.com/Web/downloads/platform.aspx) 安裝 Application Request Routing 1.0 模組

[![使用 Microsoft Web Platform Installer 安裝 Application Request Routing 1.0 模組](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ac30b0b997ced5645ddb-image_thumb_2.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/32002562a3905e4e4152-image_6.png)

2\. 預設會連帶 URL Rewrite 一併安裝，以及其他必要的相關元件也會自動安裝

[![預設會連帶 URL Rewrite 一併安裝，以及其他必要的相關元件也會自動安裝](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/340a0fc1623dcbf47ec2-image_thumb_1.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8be428a5fb3ca38fb3d5-image_4.png)

    接著按下 I Accept 就會進行自動安裝了。

[![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/17748329b1a233e75e54-image_thumb_3.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4ec20f56e7c6027d5b1d-image_8.png)

3\. 若順利安裝，會得到以下畫面

[![若順利安裝，會得到此畫面](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2396f247aadadf4cd3c3-image_thumb_4.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/534e93f8890ebcb51bac-image_10.png)

### 開啟 IIS 管理員進行設定

1\. 先檢視模組是否安裝正確，你先點選「伺服器節點」，再看看 IIS 區段中有沒有 Application Request Routing 與 URL Rewrite 模組。

[![先檢視模組是否安裝正確，你先點選「伺服器節點」，再看看 IIS 區段中有沒有 Application Request Routing 與 URL Rewrite 模組](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/aab500b0eaa1fec1bb44-image_thumb_6.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b04a9528e7ab94f8cbac-image_14.png)

2\. 先對 Application Request Routing 進行設定，啟用 Proxy 功能，以及取消勾選 "**Reverse rewrite host in response headers**" 選項，然後再點選右邊的「套用」按鈕，其他預設值都可以不用修改。此步驟修正完成後必須重新啟動 IIS 才會生效。

![啟用 Proxy 功能，以及取消勾選 "Reverse rewrite host in response headers" 選項，然後再點選右邊的「套用」按鈕，其他預設值都可以不用修改](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d8e587e0c8110e4748db-image_25.png "啟用 Proxy 功能，以及取消勾選 \"Reverse rewrite host in response headers\" 選項，然後再點選右邊的「套用」按鈕，其他預設值都可以不用修改")

3\. 接著設定 URL Rewrite 模組，也是進入門檻最高的地方。首先我們先新增一組規則 ( Add Rules )

[![設定 URL Rewrite 模組，也是進入門檻最高的地方。首先我們先新增一組規則 ( Add Rules )](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5b3ab39c8e1ee558897a-image45_thumb.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f3a4e93ad39d36358778-image45.png)

4\. 在 Add rule with rewrite map 視窗設定一組 rewrite map 的名稱，你可以自己手動輸入，但名稱請不要使用空白或特殊符號！在這裡我們手動設定名稱為 ReverseProxyMap

![在 Add rule with rewrite map 視窗設定一組 rewrite map 的名稱，你可以自己手動輸入，但名稱請不要使用空白或特殊符號！在這裡我們手動設定名稱為 ReverseProxyMap ](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/75329d10977f82290c85-image_22.png)

5\. 我們先新增幾筆我們要設定的 Reverse Proxy 對應表，這裡的 Rewrite Map 是一組很簡單的 Key/Value 值而已，我的目的是要用來對應 HTTP Request 的 HTTP\_HOST 標頭值，並轉譯成另一個網址，以達到 Reverse Proxy 的目的。

[![我們先新增幾筆我們要設定的 Reverse Proxy 對應表，這裡的 Rewrite Map 是一組很簡單的 Key/Value 值而已，我的目的是要用來對應 HTTP Request 的 HTTP\_HOST 標頭值，並轉譯成另一個網址，以達到 Reverse Proxy 的目的。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/bc9848d2f755c8e3f936-image_thumb_10.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7cb7826a078a3f49cfb2-image_24.png)

6\. 然後我們點選 Back To Rules 準備進行修改 URL Rewrite 的主要設定。

![然後我們點選 Back To Rules 準備進行修改 URL Rewrite 的主要設定。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/801e40fa8ee9a0db3e06-image_29.png)

7\. 接著在預設幫你建立的 Rewrite rule1 for ReverseProxyMap 這個 Rule 上按滑鼠右鍵進行編輯(Edit)

![接著在預設幫你建立的 Rewrite rule1 for ReverseProxyMap 這個 Rule 上按滑鼠右鍵進行編輯(Edit)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ae06e9f52b7de05b6f4a-image_32.png)

8\. 這裡的預設設定大多不是我們要的，為了達到 Reverse Proxy 的功能，我們必須修改 Conditions 與 Action 的參數。

![這裡的預設設定大多不是我們要的，為了達到 Reverse Proxy 的功能，我們必須修改 Conditions 與 Action 的參數。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/102ba1df9488a1b877ad-image_35.png)

9\. 修改 Conditions 參數，將預設的參數改掉，你只要將 Condition input 修改成 {ReverseProxyMap:{HTTP\_HOST}} 即可。

 ![修改 Conditions 參數，將預設的參數改掉，你只要將 Condition input 修改成 {ReverseProxyMap:{HTTP\_HOST}} 即可](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/578aaafafd4b51077a58-image_41.png)

10\. 最後我們將 Action 區段的 Rewrite URL 修改成 http://{C:0}/{R:0}，將 Append query string 勾選，以及將 Stop processing of subsequent rules 勾選，在點選「**套用**」就大功告成了！

 ![最後我們將 Action 區段的 Rewrite URL 修改成 http://{C:0}/{R:0}，將 Append query string 勾選，以及將 Stop processing of subsequent rules 勾選，在點選「套用」就大功告成了！](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/237ef1db64d9f51b5827-image_26.png)

\---

最後，進行測試 [http://192.168.2.253/](http://192.168.2.253/) 所得到的網頁就是 [http://www.miniasp.com/](http://www.miniasp.com/) 的網頁內容，也明確的符合 Reverse Proxy 的需求。

接著我自己新增一筆 Rewrite Map Entry，在 Original Value 的地方我設定成 testarr ( 這是一個不存在的網域，所以我有在我本機的 hosts 檔案設定這筆紀錄 )，在 New Value 的地方設定成另一個網站網址。

![接著我自己新增一筆 Rewrite Map Entry，在 Original Value 的地方我設定成 testarr ( 這是一個不存在的網域，所以我有在我本機的 hosts 檔案設定這筆紀錄 )，在 New Value 的地方設定成另一個網站網址。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c7736d78c3c907a797fa-image_49.png)

測試成功！以上圖為例，我連結到 http://testarr/ 所得到的網頁就是 [http://www.yam.com/](http://www.yam.com/) 網頁的內容！

\---

[Reverse Proxy](http://en.wikipedia.org/wiki/Reverse_proxy) 只是 **ARR** ( [Application Request Routing](https://learn.microsoft.com/en-us/iis/extensions/planning-for-arr/using-the-application-request-routing-module) ) 模組的一個應用而已，實際上 ARR 能做的事情可多著呢，例如說組織 Server Farms、實做 [HTTP Load Balance](https://learn.microsoft.com/en-us/iis/extensions/configuring-application-request-routing-arr/http-load-balancing-using-application-request-routing) ( Layer 7 )、實做 External Cache，甚至於[搭配 NLB](https://learn.microsoft.com/en-us/iis/extensions/configuring-application-request-routing-arr/achieving-high-availability-and-scalability-arr-and-nlb) 還可提供 High Availability (高可用性) 與 Scalability (高延展性) 的網站環境。

在以往要實做這些機制都要花許多錢購買硬體或高價產品，免費的產品也很多，不過就是要與非常極度複雜的設定檔對抗！現在我們有 ARR 這套免費的佛心級模組，再也不怕大流量的網站需求了。

有了 ARR 雖然一開始也沒有很好設定，但是當瞭解 ARR 的架構、觀念、設定之後，你將會發現擁有 GUI 是多麼美好的事情。

**相關連結**

-   [Using the Application Request Routing Module](https://learn.microsoft.com/en-us/iis/extensions/planning-for-arr/using-the-application-request-routing-module)
-   [IIS 7.0 - Application Request Routing (ARR) 線上討論區](http://forums.iis.net/1154.aspx)
-   [Using URL Rewrite Module](https://learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/using-the-url-rewrite-module)
-   [URL Rewrite Module Configuration Reference](https://learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference)
-   [Reverse Proxy](http://en.wikipedia.org/wiki/Reverse_proxy)
-   [Application Request Routing Version 2](https://learn.microsoft.com/en-us/iis/extensions/planning-for-arr/application-request-routing-version-2-overview)
-   [Modifying HTTP Response Headers](https://learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/modifying-http-response-headers)
-   [Reverse Proxy with URL Rewrite v2 and Application Request Routing](https://learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/reverse-proxy-with-url-rewrite-v2-and-application-request-routing)
-   [10 URL Rewriting Tips and Tricks | RuslanY Blog](http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/)
