1. 程式人生 > >用 IIS 實現請求轉發

用 IIS 實現請求轉發

最近部門要開發一個簡單的APP,部分資料是現有專案已經存在的,為了方便維護,希望只提供一個互動的入口,並且協議的規則不變。

基於這個需求,有兩套解決方案:

1.用程式碼將現有的api封裝一層,對請求資料和返回資料不做任何改變,只是中轉,然後和新的資料介面一起部署在一個專案裡;

2.用IIS進行請求轉發,呼叫現有介面迴應請求,剩餘部分開發新的api,部署在一個專案裡,用URL Rewrite進行過濾分發。

第一個方案很傳統,沒什麼好評價的,這裡主要講一下第二種方案的實現,第二個方案的好處是可以節省時間成本,需要依賴IIS外掛(Application Request Routing + URL Rewrite)。

先下載ARR 和 URL Rewrite 進行安裝,使用過程中發現ARR對IIS的“目錄瀏覽”功能有依賴(未驗證,如果無法使用,可以檢視一下是否安裝了“目錄瀏覽”功能):

http://www.iis.net/downloads/microsoft/application-request-routing#additionalDownloads

http://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads

安裝好外掛,重新開啟IIS

雙擊IIS根目錄

雙擊Application Request Routing Cache

雙擊右邊的 Server Proxy Settings

勾上 Enable proxy

點選“應用”後,新建一個站點,用來接受請求做轉發

雙擊站點,雙擊 URL Rewrite -> Add Rules(新建規則) -> Blank rule(空白規則) 

Name:填寫你的規則名稱

Match URL 是匹配Requested URL的規則

http://www.test.com?name=michael&age=30

host: www.test.com

requested url: ?name=michael&age=30

query string: name=michael&age=30

Requested URL 選擇 Matches the Pattern (匹配符合規則的url)

Using 選擇 Regular Expressions (使用正則表示式來匹配)

Pattern 裡填寫 ^(.*) 這裡不對正則表示式做講解,有需要的可以自己瞭解。

勾選 Ignore case 忽略大小寫

展開 Conditions 條件篩選

Logical grouping 選擇 Match Any

Match All 是列表中所有規則都要匹配才符合(與)

Match Any 是列表中有一個規則匹配就算符合(或)

track capture group across conditions 跟蹤捕獲組,這個功能跟正則有關,這裡不需要不勾選,可以查詢關鍵詞 capture group  自行了解詳情

點選 Add 新增條件 

Condition input 填寫  {HTTP_HOST}  ,HTTP_HOST 代表請求頭裡的host,就是上面例子裡的 www.test.com 部分, 更多可過濾條件查詢 Server Variables  自行了解

Check if input string 選擇 Matches the Pattern 

Pattern 填寫 ^arrtest.com$  ,這裡的意思是如果host是 arrtest.com 則匹配通過,例:http://arrtest.com?asdf=1234

如果這裡填寫的是 ^www.arrtest.com$  ,則匹配 http://www.arrtest.com?asdf=1234

勾選 Ignore case 忽略大小寫

雙擊展開 Action 部分

Action type 選擇 Rewrite 重寫轉發

Rewrite URL 裡填寫 https://cn.bing.com/{R:1} 轉發目標地址, {R:1} 代表 Match URL 部分匹配到的 Request URL 

勾選 Append query string 追加查詢字串 

到此配置結束,儲存這個規則,在瀏覽器訪問 http://arrtest.com/search?q=測試 就等同於訪問 https://cn.bing.com/search?q=測試  

為了防止該站點下的其他介面被這個規則無腦轉發,我們需要新增一個轉發條件

現有的需要轉發的 API 格式如下 http://arrtest.com?PROTOID=123456 

其他介面是沒有 PROTOID 這個關鍵詞的,並且 PROTOID 後面的value都是數字,那麼這裡就用這個關鍵詞來過濾需要轉發的請求

再回到剛剛的 Conditions 部分,點 Add 新增條件

Condition input 填寫 {QUERY_STRING} 

Check if input string 選擇 Matches the Pattern

Pattern 填寫 PROTOID=\d+ 這個規則的意思是,匹配查詢字串為 PROTOID 開頭引數值為數字的請求(例:http://arrtest.com/?PROTOID=456789)

勾選 Ignore case 忽略大小寫

確定儲存,修改 匹配邏輯為 Match All (與),列表內所有的規則都匹配,請求才會通過

現在只有 QueryString 為 PROTOID 開頭引數值為數字的請求才會被轉發了

例子:http://arrtest.com/search?PROTOID=4564&q=測試   =>   http://cn.bing.com/search?PROTOID=4564&q=測試

http://arrtest.com/search?q=測試&PROTOID=4564  則不會被轉發 

至此請求轉發的功能就實現了,除此之外,強大的 ARR + URL Rewrite 還可以實現高可用負載均衡

來源:http://www.cnblogs.com/mahatmasmile/p/5725253.html