ASP.NET偽靜態 UrlRewrite(Url重寫) 實現和配置


核心提示:大家一定經常在網絡上看到很多網站的地址后綴都是用XX.HTML或者XX.ASPX等類似靜態文件的標示來操作的吧,那么大家有懷疑過他真的是一個一個的靜態生成的文件么,靜態文件的生成的優缺有好有壞,對於訪問量很大的網站,利用靜態文件可提高服務器的運行穩定和速度...

大家一定經常在網絡上看到很多網站的地址后綴都是用XX.HTML或者XX.ASPX等類似靜態文件的標示來操作的吧,那么大家有懷疑過他真的是一個一個的靜態生成的文件么,靜態文件的生成的優缺有好有壞,對於訪問量很大的網站,利用靜態文件可提高服務器的運行穩定和速度,壞處就是生成列表的時候會因為增加一條記錄從而需要所有相關的列表進行重構,當然不排除有的公司已經攻克的這個問題,但對於大眾程序員來說,他依舊是個問題,而且生成的化對於中小型網站也不一定會比動態的號,因為管理比較麻煩。

結構以上事實,然后偽靜態技術產生了,規范的說就是URL重寫技術,他對於ASPX格式支持最好,當然也可以重寫HTML格式的文件,但這需要IIS的設置,相對比來說,ASPX格式的更方便,本站就是采用了該URL重寫技術,這個技術優點顯而易見:方便搜索引擎收錄,方便查看,等等。那么接下來我們來看看如何配置他吧

首先你要在你的項目里引用兩個DLL:

URLRewriter.dll
ActionlessForm.dll

真正實現重寫的是 URLRewriter.dll 但是如果你要實現分頁,那么必須使用這個ActionlessForm.dll

URLRewriter.dll
1、下載文件

2、配置WEB.CONFIG文件
在項目中引用這個程序集,偽靜態語法...(例把.aspx 的頁面 用.html來表示,web.config文件中--> 添加 以下節點
<configuration>
  <configSections>
    <section name= "RewriterConfig" requirePermission= "false" type= "URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
  </configSections>

  <RewriterConfig>
    <Rules>
      <RewriterRule><!--一個參數->
        <LookFor>~/cn/ss_(.[\d]*)\.html</LookFor>
        <SendTo>~/cn/news.aspx?id=$ 1</SendTo>
      </RewriterRule>
      <RewriterRule><!--傳兩個參數的-->
        <LookFor>~/cn/ss_(.[\d]*) 0(.[\w]*).html</LookFor> <!--(.[\d]*)(.[\w]*).html  或者 ss_,(.[ 0- 9]*),(.[ 0- 9]*)\.html-->
        <SendTo><![CDATA[~/cn/news.aspx?id=$ 1&sid=$ 2]]></SendTo>
      </RewriterRule>
      <RewriterRule><!--三個參數-->
        <LookFor>~/cn/ss_(.[\d]*) 0(.[\w]*) 0(.[\w]*).html</LookFor>
        <SendTo><![CDATA[~/ZH-CN/news.aspx?id=$ 1&sid=$ 2&n_id=$ 3]]></SendTo>
      </RewriterRule>
      <RewriterRule>
        <LookFor>~/dfsaddf/index(\d*)\.html</LookFor>
        <SendTo>~/Favorites_Page.aspx</SendTo>
      </RewriterRule>
    </Rules>
  </RewriterConfig>
</configuration>


<system.web>
  <httpHandlers> 
        <add verb= "*" path= "*.aspx" type= "URLRewriter.RewriterFactoryHandler, URLRewriter" /> 
        <add verb= "*" path= "*.html" type= "URLRewriter.RewriterFactoryHandler, URLRewriter" /> 
  </httpHandlers>
</system.web>

<!--
<httpModules>
      <add type= "URLRewriter.ModuleRewriter, URLRewriter" name= "ModuleRewriter"/>
</httpModules>
-->

設置完以上步驟,就基本可以運行了,其中<RewriterRule/>標簽里面就是重寫的一個模塊,<LookFor/>里面的是重寫后的地址,而<SendTo/>則是原地址。

 

3、配置IIS解析.html文件
配置IIS6.0IIS配置:網站->屬性 ->虛擬目錄->配置(G)...->映射->通配符應用程序映射->添加
可執行文件:c:\windows\microsoft.net\framework\v2.0.50727 \aspnet_isapi.dll
擴展名為:.html

確認文件是否存在:不選.

配置IIS7.5你的網站-->IIS中處理程序映射-->
添加腳本映射(路徑:*.html 可執行文件%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll 名稱:任意,比如Hml )
添加通配符腳本映射(路徑:* 可執行文件:C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll 名稱:任意,比如All)
托管處理程序映射(路徑:* 可執行文件:System.Web.UI.PageHandlerFactory 名稱 任意 比如Html-Integrate)-------->
IIS中 模塊-->添加---->(名稱:任意 如All 類型:URLRewriter.ModuleRewriter 把 僅針對向asp.net 應用程序或托管處理程序發出請求調用 勾上 ok )
-->ok
4、以上配置好之后就可以通過以下方式來訪問了

例如用戶輸入 hostname/d11.html,
服務器會把他重寫為http://hostname/default.aspx?id=11。
換句話說用戶輸入http://hostname/d11.html,
實際訪問的是http: //hostname/default.aspx?id=11
ActionlessForm.dll
namespace ActionlessForm
{
     public  class Form : System.Web.UI.HtmlControls.HtmlForm
    {
         protected  override  void RenderAttributes(HtmlTextWriter writer)
        {
            writer.WriteAttribute( "name"this.Name);
             base.Attributes.Remove( "name");
            writer.WriteAttribute( "method"this.Method);
             base.Attributes.Remove( "method");
             this.Attributes.Render(writer);
             base.Attributes.Remove( "action");
             if ( base.ID !=  null)
                writer.WriteAttribute( "id"base.ClientID);
        }
    }
}

創建此類並對其進行編譯之后,要在 ASP.NET Web 應用程序中使用它,應首先將其添加到 Web 應用程序的 References 文件夾中。然后,要 使用它來代替 HtmlForm 類,做法是在 ASP.NET 網頁的頂部添加以下內容:

<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %> 然后,將 <form runat="server">(如果有)替換為: <skm:Form id="Form1" method="post" runat="server"> 並將右邊的 </form> 標記替換為:

</skm:Form>

 

成功!
虛擬主機

在網上看到,很多朋友在asp.net中做urlrewrite,用的是HttpHandle+Server.Transfer的方法。其實這種方法是錯誤的。

第一,HttpHandle是實現不了urlrewrite的;

第二Server.Transfer是標准的重定向,根本不是urlrewrite。

其實,實現urlrewrite不用自己HttpHandle,也不用自己實現HttpModule,用幾行代碼就可以輕松實現。我這里介紹的是在虛擬主機上,虛擬主機不同於自己的服務器,你是沒有權限去修改iis,也沒有權限去安裝iis rewrite之類的iis插件。但是我們仍然可以輕松完成需要的功能。具體做法如下:打開global.asax.cs,定位到protected void Application_BeginRequest(Object sender, EventArgs e)。從方法名我想也能猜到它是做什么的。輸入如下代碼:


 

protected  void Application_BeginRequest(Object sender, EventArgs e)
{
string oldUrl = HttpContext.Current.Request.RawUrl ;
string pattern =  @"^(.+)default/(\d+)\.aspx(\?.*)*$";
string replace =  "$1default.aspx?id=$2"if(Regex.IsMatch(oldUrl, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled))
{
string newUrl = Regex.Replace(oldUrl, pattern, replace, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
this.Context.RewritePath(newUrl); 

}

有了上邊這段代碼,我訪問一個類似:.../default/123.aspx 的網址,當然這個網址在我的電腦上不存在,它就會被定向到:.../default.aspx?id=123。

當然,利用功能強大的正則表達式,你可以任意按照自己的需要來重寫url,這一切都是在服務器端默默的進行,在客戶端是不會有任何察覺的。由於是在虛擬主機上,我們只能重定向.aspx文件,如果是自己的服務器,只要把后綴名在iis中注冊一下,就可以實現任意后綴名的處理。比如你可以注冊一個*.myweb這樣的類型,這樣別人訪問default/456.myweb時,你可以把它重定向到default.aspx?id=456。總之一句話,只要你能想到,.net就可以幫你實現,並且這一切不需要多少的代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM