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

来源:http://www.cnblogs.com/zeroes/archive/2016/03/12/iis-arr-node.html
-Advertisement-
Play Games

Application Request Route(文中簡稱為ARR)是一個寄宿於 IIS7(及以後的IIS 版本)的一個基於代理的模塊,它可以通過判斷 Http Headers,Server Variables 以及負載均衡演算法將 HTTP 的請求轉發到不同的處理伺服器之上。ARR依賴URL Re...


目標:

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

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

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

步驟:

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

註意去掉虛擬目錄->壓縮->"啟用動態內容壓縮"和“啟用靜態內容壓縮” 前面的勾選。否則會出現如下錯誤:

HTTP 錯誤 500.52 - URL Rewrite Module Error.

HTTP 響應的內容已編碼(“gzip”)時,無法應用出站重寫規則。

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

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

  3.安裝ARR,啟用Proxy

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

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

     

 

 

 

 

 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效果。如下圖:

這是因為入站規則能把請求轉發到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.完整的配置文件奉上

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <outboundRules>
                <clear />
                <rule name="bbbbb" enabled="true" stopProcessing="false">
                    <match filterByTags="A, Area, Base, Form, Frame, Head, Img, Input, Link, Script" pattern="^(.*)" />
                    <conditions logicalGrouping="MatchAny" trackAllCaptures="true">
                        <add input="{URL}" pattern="^/proxy.*" />
                    </conditions>
                    <action type="Rewrite" value="/proxy{R:1}" />
                </rule>
                <rule name="站外重定向" enabled="true" stopProcessing="true">
                    <match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                        <add input="{RESPONSE_STATUS}" pattern="^302" />
                    </conditions>
                    <action type="None" />
                </rule>
                <rule name="站外跳轉2" enabled="true" stopProcessing="true">
                    <match serverVariable="RESPONSE_LOCATION" pattern="^https://[^/]+/(.*)" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                        <add input="{RESPONSE_STATUS}" pattern="^302" />
                    </conditions>
                    <action type="None" />
                </rule>
                <rule name="站內從定向" enabled="true">
                    <match serverVariable="RESPONSE_LOCATION" pattern="^(.*)" />
                    <conditions logicalGrouping="MatchAny" trackAllCaptures="true">
                        <add input="{RESPONSE_STATUS}" pattern="^302" />
                    </conditions>
                    <action type="Rewrite" value="/proxy{R:1}" />
                </rule>
            </outboundRules>
            <rules>
                <remove name="aaaaa" />
                <rule name="aaaaa" stopProcessing="true">
                    <match url="^(.*)" />
                    <conditions />
                    <serverVariables />
                    <action type="Rewrite" url="http://localhost:8898/{R:1}" logRewrittenUrl="true" />
                </rule>
            </rules>
        </rewrite>
        <urlCompression doStaticCompression="false" doDynamicCompression="false" />
    </system.webServer>
</configuration>
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實現功能變數名稱解析。

 

開博第一篇,推薦、推薦、推薦 一下吧,重要的事情說三遍。

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •  
  •   引: VMware 下LINUX出現:Device eth0 does not seem to be present, delaying initialization.解決辦法 VMWare 克隆 複製   eth0 be present 找不到 解決方案 vmware clone 網卡 VMw
  • 1.UITabBarController:和UINavigationController類似,也可以輕鬆管理多個控制器,輕鬆完成空間之間的轉換。 2.UITabBarController的使用: (1)使用步驟:          <1>初始化UITabBarController          
  • http://cc.bingj.com/cache.aspx?q=OpenEmbedded+clfs&d=4706495287069596&mkt=zh-CN&setlang=zh-CN&w=afp8GvZe7KNcRFBKF2kYXd8WwVn9MVkI CLFS stands for Cross
  • 七、bash腳本中的流程式控制制  條件判斷控制  -[]([]中的表達式是否為真)  &&(前邊的結果是true的時候執行後邊的命令)   ||(前邊的結果是false的時候執行後邊的命令)  -if  -case  迴圈控制  -while  -utile  -for  -break  -conti
  • 張超《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 我的代碼可見https://www.shiyanlou.com/courses/reports/986221 在這裡我們用的是linux-3.18.6版本,以下簡寫
  • Nginx最大特點: 靜態小文件(1M),支持高併發,同時占用系統資源很少。3W併發,10個進程,記憶體150M。 Nginx特點: 1、配置簡單,靈活,輕量。 2、高併發(靜態小文件),靜態幾萬的併發。 3、占用資源少。2W併發 開10個線程服務,記憶體消耗幾百M。 4、功能種類較多(Web,cach
  • 一、作用 文件/etc/apt/sources.list是一個普通可編輯的文本文件,保存了ubuntu軟體更新的源伺服器的地址。和sources.list功能一樣的是/etc/apt/sources.list.d/*.list(*代表一個文件名,只能由字母、數字、下劃線、英文句號組成)。source
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...