[ASP.Net] 利用UrlRewriter.Net做出可以讓多個網址共用的ASP.Net網站

之前接了一個專案(在.Net Framework 3.5的時代),業主希望能透過後台的設定,針對不同的客戶產生不同網址的前台系統,例如說,要讓使用者可以用像http://ABC.com/Gamania或是http://ABC.com/HTC等等的網址進入系統。
但是我不可能動態的幫每個使用者都建立一個虛擬目錄,又把檔案複製一份啊~那怎麼辦呢?


之前接了一個專案(在.Net Framework 3.5的時代),業主希望能透過後台的設定,針對不同的客戶產生不同網址的前台系統,例如說,要讓使用者可以用像http://ABC.com/Gamania或是http://ABC.com/HTC等等的網址進入系統。
但是我不可能動態的幫每個使用者都建立一個虛擬目錄,又把檔案複製一份啊~那怎麼辦呢?
只要能把http://ABC.com/Gamania變成http://ABC.com/Default.aspx?ProjectName=Gamaniahttp://ABC.com/HTC變成http://ABC.com/Default.aspx?ProjectName=HTC
這樣我就只需要一個Default.aspx,也不用特別為不同的使用者建立虛擬目錄,就能用一份檔案搞定所有使用者啦!!
也就是說,只要能把要讓使用者看的網址做些處理,轉成是系統看得懂的網址就可以了,但是ASP.Net 3.5版好像沒內建這樣的功能啊(苦惱)

後來發現一個Open Source的超方便元件 -- UrlRewriter.NET,目前最新的版本是2.0RC1b6

image

只要下載所需要的版本,之後將Intelligencia.UrlRewriter.dll檔加入ASP.Net專案的參考,再將web.config做以下調整:

web.config

<?xml version="1.0"?>
 
<configuration>
 
  <configSections>
    <section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
  </configSections>
 
  <system.web>
 
    <httpModules>
      <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
    </httpModules>
 
  </system.web>
 
  <!-- 以下這段就是=Rewrite的設定 --> 
  <rewriter>
    <rewrite url="~/(.+)/(.+).aspx$" to="~/$2.aspx?ProjectName=$1" processing="stop" />
    <rewrite url="~/Admin/(.+).aspx$" to="~/$1.aspx" processing="stop" />
    <rewrite url="~/(.+)/$" to="~/CaseList.aspx?ProjectName=$1" processing="stop" />
    <rewrite url="~/(.+).aspx$" to="~/Error/ErrorPage.aspx" />
    <rewrite url="~/Error/ErrorPage.aspx" to="~/ErrorPage.aspx" processing="stop" />
  </rewriter>
 
</configuration>

 

如果IIS用的是7.0之後的版本,則請參考以下設定:

web.config

<?xml version="1.0"?>
 
<configuration>
 
  <configSections>
    <section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
  </configSections>
 
  <system.web>
 
    <httpModules>
      <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
    </httpModules>
 
  </system.web>
 
  <!-- IIS 7.0之後的版本要加入以下的部份 -->
  <system.webServer>
 
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" />
    </modules>
 
    <validation validateIntegratedModeConfiguration="false" />
 
  </system.webServer>
 
  <!-- 以下這段就是=Rewrite的設定 --> 
  <rewriter>
    <rewrite url="~/(.+)/(.+).aspx$" to="~/$2.aspx?ProjectName=$1" processing="stop" />
    <rewrite url="~/Admin/(.+).aspx$" to="~/$1.aspx" processing="stop" />
    <rewrite url="~/(.+)/$" to="~/CaseList.aspx?ProjectName=$1" processing="stop" />
    <rewrite url="~/(.+).aspx$" to="~/Error/ErrorPage.aspx" />
    <rewrite url="~/Error/ErrorPage.aspx" to="~/ErrorPage.aspx" processing="stop" />
  </rewriter>
 
</configuration>

 

上面的rewrite區段就是利用Regular Expression去針對不同的Url設定不同的Rewrite規則,而關於rewrite區段的設定參數和範例則可以參考 UrlRewriter.NET 參數設定與範例


設定完的成品如下(為保護當事人,部份網址予以打上馬賽克):

image

image


設定完成之後就可以仿造出不同網址是不同網站的感覺,而且還能避免透露出網址列的參數,真是一舉多得啊!!