ASP.NET 2.0 實現偽靜態網頁方法 (轉載 ————續)

來源:互聯網
上載者:User

方法一:利用Httphandler實現URL重寫(偽URL及偽靜態)

我們有時候會見到這樣的地址:“http://www.huoho.com/show-12-34.html”,你或許認為在站台伺服器根目錄“/”下存在名為“show-12-34.html”的檔案,其實實際它可能是不存在的,而可能你看到的內容是“/aspx/show.aspx?type= 12&id=34”的內容,為什麼要這樣做呢?原因有多個方面:首先是增強URL的友好性,記“show-12-34.html”總比 “/aspx/show.aspx?type=12&id=34”好記吧?其次就是方便搜尋引擎收錄,很多搜尋引擎更看好靜態HTML頁,比如:百度;其次就是出於安全性的考慮,因為這樣隱藏了參數“type”、“id”。是不是很有意思呢?

其實這是利用URL重寫實現的,下面我就說一下在ASP.NET2.0下我所知道的最簡單的實現方法:通過實現介面“IHttpHandler”來接管HTTP請求,Follow me!

1.在資源管理方案中添加一個類,類的代碼如下:

  //類URLRewriter程式清單:
      using System;
      using System.Data;
      using System.Configuration;
      using System.Web;
      using System.Web.Security;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      using System.Web.UI.WebControls.WebParts;
      using System.Web.UI.HtmlControls;
      /// <summary>
      /// UrlRewriter URL重寫類
         /// Author:yoyo
      /// blog:http://yangmingsheng.cn
      /// </summary>
      public class UrlRewriter : IHttpHandler //實現“IHttpHandler”介面
      {
         public UrlRewriter()
      {
      //
      // TODO: 在此處添加建構函式邏輯
         //
      }
      public void ProcessRequest(HttpContext Context)
      {
      try
      {
      //取得原始URL屏蔽掉參數
      string Url = Context.Request.RawUrl;
      //建立Regex
           System.Text.RegularExpressions.Regex Reg = new System.Text.RegularExpressions.Regex

           (@"/show-(\d+)-(\d+)\..+",System.Text.RegularExpressions.RegexOptions.IgnoreCase);
      //用Regex進行匹配
      System.Text.RegularExpressions.Match m =

                    Reg.Match(Url,Url.LastIndexOf("/"));//從最後一個“/”開始匹配
      if (m.Success)//匹配成功
      {
      String RealPath =

                   @"~/aspx/show.aspx?type=" + m.Groups[1] + "&id=" + m.Groups[2];
      //Context.Response.Write(RealPath);
      //Context.RewritePath(RealPath);//(RewritePath 用在無 Cookie 工作階段狀態中。)
      Context.Server.Execute(RealPath);
      }
      else

                     {
      Context.Response.Redirect(Context.Request.Url.ToString());
      }
      }
      catch
      {
      Context.Response.Redirect(Context.Request.Url.ToString());
      }
      }
      /// <summary>
      /// 實現“IHttpHandler”介面所必須的成員
      /// </summary>
      /// <value></value>
      /// Author:yoyo
      /// blog:http://yangmingsheng.cn
      public bool IsReusable
      {
      get { return false; }
      }
      }
               

           

2.在web.config檔案還要添加一下設定項

在<system.web>節點下添加如下代碼:

            <httpHandlers>
                <add verb="*" path="*/show-?*-?*.aspx" type="UrlRewriter" />
                </httpHandlers>
               

           

解釋一下:

verb是指允許的動作“GET”、“POST”、“PUT”中的一種或幾種,星號“*”表示全部允許;

path是指匹配路徑,支援簡單的萬用字元;

type是指綁定的類名以及包括命名空間(如果有的話);

對了,首先你要建立一個WEB表單“show.aspx”在目錄“aspx”下,因為這個檔案就是實際接受請求並顯示相關內容的頁面。

OK!,編譯,開啟網站輸入地址http://localhost:80/show-12-34.aspx 訪問一下,檢查看是不是顯示的“/aspx/show.aspx?type=12&id=34”的內容呢?!

上面我是設定了匹配ASPX檔案,因為IIS裡.HTML副檔名預設是不歸ASP.NET接管的,如果要接管HTML請求,
請將IIS的副檔名.HTML映射到“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”,
然後將上面的aspx改成html:

            <httpHandlers>
                <add verb="*" path="*/show-?*-?*.html" type="UrlRewriter" />
                </httpHandlers>

現在開啟網站輸入地址http://localhost:80/show-12-34.html 訪問一下~!

方法二:地址修正、使用偽靜態、頁面回傳處理

 

製作網站頁面的時候,有時候為了使用者的體驗和搜尋引擎的收錄,很多網站經常使用偽靜態地址修正,或者稱為 URL地址修正的辦法,來將諸如:MyEbook.aspx?ID=1,MyEbook.aspx?ID=2MyEbook.aspx?ID=3等帶有參 數的動態網頁面偽裝成為一個靜態頁面,比如,將以上的偽裝成為My1.html,My2.html,My3.html等等諸如此類!

        出發點是很好的,不僅有利於使用者體驗,也有利於收錄,實在是一舉兩得!

         好處已講,現在來談談使用這種辦法所存在的毛病,問題就在於,當你使用偽靜態技術的頁面有按鈕,需要提交內容時,這個時候,一旦與伺服器之間有回傳動作, 那麼,地址欄裡面顯示的網頁地址就不再是偽裝出來的My1.html,My2.html,My3.html等等拉,而是變為MyEbook.aspx? ID=1,MyEbook.aspx?ID=2MyEbook.aspx?ID=3等等洛,如此一來,會讓不太懂網頁製作的網友感到不安,他們會認為自己 在上一個騙子網站,認為自己提交的資料都被另外一個網站給偷走了,總之,給他們的感覺就是,這樣的網站具有欺騙性質;很可能,以後他們再也不敢上你的網站 了!!!………

      下面本人就個人解決如上問題的心得體會做如下說明,希望能夠協助廣大網友解決問題!

       解決如上問題,有很多種辦法,有使用Javascript禁止回傳,有將頁面的

改為等等多種方法,反正能改的地方,都有人使用過了,並且,這樣的文章比較多,但是難以實現,就本人脾氣而已,更喜歡直接了當的辦法,盡量少改地方,免得日後出錯麻煩;

      第一步:開啟你的網站下面,建立一個類,檔案名稱大體如此:MyActionlessform.cs

      第二步:該類的代碼如下:

using System;
using System.IO;
using System.Web;
using System.Web.UI;
namespace MyURL
{
    public class MyOLPage : Page
    {
        public MyOLPage()
        { }
        protected override void Render(HtmlTextWriter writer)
        {
            if (writer is System.Web.UI.Html32TextWriter)
            {
                writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
            }
            else
            {
                writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
            }
            base.Render(writer);
        }
    }

    internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
    {
        private string _url; // 偽裝的URL
        internal FormFixerHtml32TextWriter(TextWriter writer)
            : base(writer)
        {
            _url = HttpContext.Current.Request.RawUrl;
        }
        public override void WriteAttribute(string name, string value, bool encode)
        {
            if (_url != null && string.Compare(name, "action", true) == 0)
            {
                value = _url;
            }
            base.WriteAttribute(name, value, encode);
        }
    }
    internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
    {
        private string _url;
        internal FormFixerHtmlTextWriter(TextWriter writer)
            : base(writer)
        {
            _url = HttpContext.Current.Request.RawUrl;
        }
        public override void WriteAttribute(string name, string value, bool encode)
        {
            if (_url != null && string.Compare(name, "action", true) == 0)
            {
                value = _url;
            }
            base.WriteAttribute(name, value, encode);
        }
    }
}
之後,將這個類檔案編譯成為MyActionlessform.dll檔案,並在網站的項目中引用他,

第三步:開啟具有回傳操作的頁面,將其中的:System.Web.UI.Page更改為: MyURL.MyOLPage,如此而已,一勞永逸了,以後不再擔心回傳暴露真真實位址嚇走網友拉!

至此,大功可成一半多一點,接下來問題又來了,什麼問題呢,你運行一下你的網站,是不是出現如下錯誤呀!

CS0433: 類型“MyURL.MyOLPage”同時存在於“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ Temporary ASP.NET Files\schoolit\3266aab1\aca2fc74\App_Code.2-69spm5.dll”和“c:\WINDOWS\ Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\schoolit\3266aab1\aca2fc74\assembly\dl3\4d107fc6\00b753fe_ea19c801\ MyActionlessform.DLL”中

大體就是這樣的錯誤了,針對這樣的錯誤,有很多解決辦法,有的地方說,刪除臨時使用的檔案夾,刪除某個命名 空間等等操作,俺都試過了,但是百試不得其果,後來俺就自己想想,出現這樣的錯誤無非就是兩個檔案同時存在,但是又不能重複使用,解決辦法那還不簡單,停 用一個,只使用一個就行了嘛

       上面的,我們不是建立了一個MyActionlessform.cs了嗎,它存在App_Code這個檔案夾裡面,另外一個是 MyActionlessform.dll,兩個檔案內容完全一樣,做好了,我們就不需要MyActionlessform.cs了,我們只需要 MyActionlessform.dll,那麼,想方設法將前者弄走不就得了(本人建議將此檔案排除項目,不提倡直接刪除該檔案,因為以後可能使用 到),本人做法是,在項目中直接排出MyActionlessform.cs檔案,經過測試,大功至此已結束!!!!

 

方法三:利用Mircosoft URLRewriter.dll實現頁面偽靜態
昨天,轉貼了一篇利用ISAPI篩選器來實現URL偽靜態文章,我按照文章上的內容做,可是沒有做出來,目前看來,該方法沒有使用Microsoft URLRewriter.dll這個方法好,至少我個人覺得,花了一個晚上的時間,終於研究出來了怎麼利用這個dll檔案來對asp.net頁面實現靜態 化了,其實很簡單。
一,獲得Mircosoft URLRewriter.dll:
獲得Mircosoft URLRewriter.dll可以到http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx?mfr=true
這裡,選擇[下載本文的原始碼],下載完畢後,匯入工程,我這裡沒有對該工程做任何修改,保留了原來的重寫方式,然後直接在VS2005裡面產生.dll檔案就可以了。
二,使用該dll檔案:
添加引用,搞定。
三,頁面方面的設計,這裡不在贅述了,我會放一個下載包,有興趣的朋友下載來看看吧,代碼寫的比較亂。
四,web.config的配置
這部是非常關鍵的,也是靜態化能否成功的關鍵。
本文執行個體下載:http://files.cnblogs.com/zhangyi85/StaticWeb.rar

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
  </configSections>

  <RewriterConfig>
        <Rules>
            <RewriterRule>
                <LookFor>~/web/new/type/(.[0-9]*)\.html</LookFor>
        <SendTo>~/web/new.aspx?id=$1</SendTo>
            </RewriterRule>
      <RewriterRule>
        <LookFor>~/web/index.html</LookFor>
        <SendTo>~/web/index.aspx</SendTo>
      </RewriterRule>
        </Rules>
    </RewriterConfig>
    <system.web>
    <httpHandlers>
      <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
      <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
    </httpHandlers>
        <compilation debug="true"/></system.web>
</configuration>

這裡簡單介紹一下:

<RewriterConfig>
   <Rules>
   <RewriterRule>
      <LookFor>要尋找的模式</LookFor>
      <SendTo>要用來替換模式的字串</SendTo>
   </RewriterRule>
   <RewriterRule>
      <LookFor>要尋找的模式</LookFor>
      <SendTo>要用來替換模式的字串</SendTo>
   </RewriterRule>
   </Rules>
</RewriterConfig>

httpHandlers的設定主要是配合IIS將請求重新定義處理,這裡也比較關鍵,如果不存在合理的httpHandlers,那麼,訪問肯定會失敗的。

關於Regex,可以到百度裡搜尋:"常用Regex",會有很多。

五.配置IIS解析.html檔案
右鍵點我的電腦-->管理-->展開'服務和應用程式'-->internet資訊服務-->找到你共用的目錄-->右鍵 點擊屬性 -->點擊'配置'-->映射下面 -->找到.aspx的可執行檔路徑 複製路徑-->粘貼路徑-->副檔名為".html"-->然後把檢查檔案是否存在的勾去掉這樣就可以了,如果遇到“確定”按鈕失效, 可以用鍵盤事件編輯路徑即可解決。

本文轉自:http://www.cnblogs.com/xiachufeng/archive/2010/02/04/1663869.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.