IIS實現Nginx功能:轉發


這個標題本身是不合理的,但是基於目前公司有一份系統是外部代理商貼牌使用,有一個老的站點是部署在IIS上,好多代理商自己的域名綁定在這個上面,而近期新版本的系統已經上線,那么需要將這些域名也轉發到新的站點上。目前有兩個問題:(1)這台服務器無法去安裝Nginx,因為需要占用80端口,那么服務器上的所有站點都需要重新配置,我們的業務場景要求我們不能隨意停機維護;(2)解析到別的服務器用nginx轉發,因為也講到了,這個站點上綁定了很多自定義的域名,要通知客戶去更新解析是一件很難的事情。

這樣一來就想到了是否可以用IIS來實現Nginx的功能,經過網絡搜索,試驗,最終確實可行,以下即為響應的流程:

 

1. 檢查IIS是否支持

 

 

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

【Application Request Routing】 http://www.iis.net/downloads/microsoft/application-request-routing#additionalDownloads

【URL重寫】http://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads

 

PS:安裝會導致IIS重載,會有那么幾秒鍾的閃停!!!

 

2. 開始配置

 

雙擊IIS根目錄

 

 

雙擊Application Request Routing Cache

 

雙擊右邊的 Server Proxy Settings

 

 

勾上 Enable proxy

 

取消勾選“Reverse rewrite host in response headers”,否則所有的響應內容的host都會被重寫為當前站點域名,簡單來講,最直接的影響就是對外部站點的重定向都會失敗,所以這里取消勾選。

 

 

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

 

雙擊站點,雙擊 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:0} 轉發目標地址, {R:0} 代表 Match URL 部分匹配到的 Request URL 

勾選 Append query string 追加查詢字符串 

 

  

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

 

PS:“停止處理后續規則”選項可用於多個規則中,比如可以設定某些匹配項,不進行轉發,可以勾選該選項

 

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

現有的需要轉發的 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 還可以實現高可用負載均衡。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM