用 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