之前接了一個專案(在.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=Gamania,http://ABC.com/HTC變成http://ABC.com/Default.aspx?ProjectName=HTC,
這樣我就只需要一個Default.aspx,也不用特別為不同的使用者建立虛擬目錄,就能用一份檔案搞定所有使用者啦!!
也就是說,只要能把要讓使用者看的網址做些處理,轉成是系統看得懂的網址就可以了,但是ASP.Net 3.5版好像沒內建這樣的功能啊(苦惱)
後來發現一個Open Source的超方便元件 -- UrlRewriter.NET,目前最新的版本是2.0RC1b6
只要下載所需要的版本,之後將Intelligencia.UrlRewriter.dll檔加入ASP.Net專案的參考,再將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之後的版本,則請參考以下設定:
<?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 參數設定與範例
設定完成之後就可以仿造出不同網址是不同網站的感覺,而且還能避免透露出網址列的參數,真是一舉多得啊!!