在配置web服務器的時候,咱們常常遇到這樣的問題,因爲某些緣由,該服務器只能擁有一個公網IP,可是可能須要提供其餘機器或者本機上其餘webserver的服務器給訪問者,同時又不但願使用其餘端口,若是在linux下,常見的解決方案是使用nginx做爲前端server,經過反向代理間接訪問其餘webserver.在IIS7以前,在windows上要實現該功能卻不是一件容易的事情,可是在IIS7上,經過Application Request Routing模塊,咱們能夠輕鬆實現反向代理.php
本次測試配置的狀況,簡單起見,只在iis中測試,配置3個網站,第一個」LevenWeb」,使用80端口提供服務,第二個」levenblog」,下面運行着levenblog2.0.9,使用8080端口,第三個」phpweb」,下面有一個」test.php」的phpinfo頁面(iis7 php配置本文再也不詳述),本機ip:192.168.1.8,爲了測試,咱們先進行域名綁定,也就是在leven.com.cn下新增3個子域名,域名綁定以下圖所示:css
咱們的目標以下:前端
http://phpweb.leven.com.cn/ 訪問phpweb站點,也就是http://localhost:8081/linux
http://levenblog.leven.com.cn/ 訪問levenblog站點,也就是http://localhost:8080/nginx
http://realblog.leven.com.cn/ 訪問公網上的levenblog站點,也就是http://leven.com.cn/web
http://localhost/leven 訪問levenblog站點,也就是http://leven.com.cn/正則表達式
首先前往http://www.iis.net/extensions/ApplicationRequestRouting下載Application Request Routing,而後安裝,本次實踐使用的是V2版.編程
安裝完畢以後,新建3個站點:windows
而後找到ARR配置菜單:服務器
開啓Proxy項:
而後在levenweb站點下配置反向代理路由,配置可使用UI界面或者直接修改web.config的模式,本次配置給出ui和config文件兩種方式,我的更喜歡config配置文件模式.
進入該項,先配置第一項, http://phpweb.leven.com.cn/ 訪問phpweb站點,也就是http://localhost:8081/,選擇」Add Rules...」:
而後選擇」Blank Rule」
而後填寫以下:
該參數設置表面ARR將攔截全部請求
繼續在」Conditions」中選擇」Add」:
該設置表面只有HTTP_HOST爲phpweb.leven.com.cn的URL才能經過該規則,若是您綁定了多個域名,能夠根據屢次增長或者經過正則表達式的|來間隔
最後在下面的Action中配置代理路徑:
在這兒,{R:1}表明了MatchUrl中的第一個匹配括號
一樣配置的web.config文件以下:
<rewrite>
<rules>
<rule name="phpweb">
<match url="^(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^phpweb.leven.com.cn$" />
</conditions>
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
</rule>
</rules>
</rewrite>
測試訪問http://phpweb.leven.com.cn/test.php,結果以下:
下面一樣能夠配置levenblog.leven.com.cn和realblog.leven.com.cn
Ui界面配置再也不說明,配置完成的web.config以下:
<rewrite>
<rules>
<rule name="levenblog">
<match url="^(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^levenblog.leven.com.cn$" />
</conditions>
<action type="Rewrite" url="http://localhost:8080/{R:1}" />
</rule>
<rule name="realblog">
<match url="^(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^realblog.leven.com.cn$" />
</conditions>
<action type="Rewrite" url="http://leven.com.cn/{R:1}" />
</rule>
<rule name="phpweb">
<match url="^(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^phpweb.leven.com.cn$" />
</conditions>
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
</rule>
</rules>
</rewrite>
訪問結果分別爲:
和
咱們再添加最後一項,將http://localhost/leven 代理到 http://leven.com.cn/
<rule name="leven.com.cn">
<match url="^leven/(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^localhost$" />
</conditions>
<action type="Rewrite" url="http://leven.com.cn/{R:1}" />
</rule>
可是此時訪問會出現問題,以下圖:
顯然,出現了css丟失等狀況,經過查看源碼:
能夠看到css的路徑有誤,不只如此,全部的img,a標籤路徑所有出現了錯誤,代理以後的地址是/leven/xxx的,可是源地址仍然是/xxx,所以咱們還須要增長一個Outbound Rule
配置好的config文件以下:
<outboundRules>
<rule name="Add application prefix">
<match filterByTags="A,Img,Script,Link" pattern="^/(.*)" />
<conditions>
<add input="{URL}" pattern="^/leven/.*" />
</conditions>
<action type="Rewrite" value="/leven/{R:1}" />
</rule>
</outboundRules>
而後刷新:
可見路徑正確.
在使用了反向代理以後,編程上也有些地方須要注意了,在取客戶端IP的時候,因爲多了一層代理,直接是沒法獲取的,所以,咱們須要開啓
而後經過獲取Header中的X-Forworded-For字段來取得客戶端IP
從測試來看,ARR是個很是有用的代理模塊,能徹底知足咱們反向代理的需求,不只如此,ARR還提供了UrlRewrite,ServerFarms,Cache等不少功能,非常值得咱們挖掘.