在IIS7中使用ARR(Application Request Routing)反向代理虛擬目錄到Nodejs站點

目標:

 1.訪問www.arrdemo.com/proxy 跳轉到 localhost:8898的Nodejs站點css

 2.Nodejs站點的頁面能夠返回到瀏覽器,包括js,css,圖片html

 3.Nodejs站點的 res.redirect(' ') 重定向要正確,包括站內跳轉和站外跳轉前端

步驟:

1. 新建站點綁定域名www.arrdemo.com,配置host文件指向本機,新建虛擬目錄proxy。  

注意去掉虛擬目錄->壓縮->"啓用動態內容壓縮"和「啓用靜態內容壓縮」 前面的勾選。不然會出現以下錯誤:node

HTTP 錯誤 500.52 - URL Rewrite Module Error.

HTTP 響應的內容已編碼(「gzip」)時,沒法應用出站重寫規則。

  2.啓動Nodejs站點 http://localhost:8898

  這個站點是《nodejs開發指南》上的microblog實例,學習過程當中改爲了Express4.13.1版本。nginx

  3.安裝ARR,啓用Proxy

   下載地址(http://www.iis.net/downloads/microsoft/application-request-routing)web

  安裝完成後,打開IIS->選中服務器名稱->雙擊 右側功能視圖 IIS 節點下的Application Request Routing Cache->點擊 右側操做視圖Proxy節點下的Server Proxy Settings->勾選上Enable Proxy前面的複選框bootstrap

     

 

 

 

 

 4.配置虛擬目錄的URL重寫規則

  在IIS節點,站點節點,虛擬目錄節點均可以配置URL從新規則,而且一級級繼承。配置完成後信息保存到對應的web.config文件中。因此若是 www.arrdemo.com部署在多個服務器上,每一個服務器的proxy虛擬目錄都須要重定向時能夠採起拷貝proxy下的web.config文件 的方式快速部署。這裏只在proxy虛擬目錄下部署,排除繼承的影響。瀏覽器

 首先,配置入站規則。把http://www.arrdemo.com/proxy/reg 這樣的url重寫成 http://localhost:8898/reg

 

雙擊"URL重寫",從入站規則下選擇空白規則模板。剩下的注意細看圖片註釋:服務器

到這一步正常狀況下在瀏覽器裏輸入http://www.arrdemo.com/proxy,應該能夠看到有內容輸出了,可是沒有任何樣式和js效果。以下圖:app

這是由於入站規則能把請求轉發到nodejs裏,nodejs返回的html內容再轉發到瀏覽器。但html裏的css和js還有圖片的路徑通常都是相對站點根路徑的,不會加上虛擬目錄proxy,因此前端看不到任何樣式。

這時候該出站規則上場了。。。。。。。

 而後,配置出站規則。把http://localhost:8898/bootstrap/..... 這樣的url轉換成http://www.arrdemo.com/proxy/bootstrap/.....

我這裏就拿已經配置好的規則演示了。規則多了分前後順序,若是匹配上了是否」中止處理「很重要。好比:匹配上兩個從新類型的規則,那麼就會在輸出裏出現proxy/proxy的情形,致使出錯。

第一個規則 bbbb,處理輸出的js、css、圖片等路徑不對問題。

 

作完第一個規則,本應萬事大吉,只剩喝酒了。然而。。。。然而。。。。。打開網頁登錄後跳轉到首頁的地址變成了 www.arrdemo.com 沒有加上proxy。接着下一規則走起。。。

第二個規則處理res.redirect('/'); 這種站內跳轉 

站內跳轉須要在輸出時添加proxy,主要是檢查  {RESPONSE_STATUS} 變量爲302, 而後在 重寫時輸出 /proxy{R:1},規則以下(請細看圖):

這樣處理後站內跳轉的就沒問題了。

 

第三個規則處理res.redirect('http://www.baidu.com'); 這種站外跳轉

  跟第二個規則的區別就是這種跳轉不作任何操做,直接拋出,規則以下:

如今再去瀏覽器裏訪問一下試試吧,若是還不行,請重啓站點。

總結:

1.完整的配置文件奉上

proxy 下的 web.config

2.查找資料除了百度、必應最應該想到的就是官網幫助文檔

每一步操做右側都有個幫助的連接,點進去是詳細的英文文檔。

不過也不要徹底相信,好比配置重定向跳轉時,文檔裏是這樣的:

複製代碼
<outboundRules> <!-- This rule changes the domain in the HTTP location header for redirection responses --> <rule name="Change Location Header"> <match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" /> <conditions> <add input="{RESPONSE_STATUS}" pattern="^301" /> </conditions> <action type="Rewrite" value="http://{HTTP_HOST}/{R:1}"/> </rule> </outboundRules>
複製代碼

我明明感受應該是302啊,這裏爲何是301;還有Rewrite 裏那麼寫真的對嗎?我不肯定,不過也獲得一個思路使用RESPONSE_STATUS變量。

微服務、nodejs好像很火的樣子,我也在嘗試。但願這篇文章可讓node+nginx實現域名解析的人們多一種解決思路 node+iis+arr實現域名解析。

相關文章
相關標籤/搜索