核心提示:大家一定經常在網路上看到很多網站的地址尾碼都是用XX.HTML或者XX.ASPX等類似靜態檔案的標示來操作的吧,那麼大家有懷疑過他真的是一個一個的靜態產生的檔案麼,靜態檔案的產生的優缺有好有壞,對於訪問量很大的網站,利用靜態檔案可提高伺服器的運行穩定和速度...
大家一定經常在網路上看到很多網站的地址尾碼都是用XX.HTML或者XX.ASPX等類似靜態檔案的標示來操作的吧,那麼大家有懷疑過他真的是一個一個的靜態產生的檔案麼,靜態檔案的產生的優缺有好有壞,對於訪問量很大的網站,利用靜態檔案可提高伺服器的運行穩定和速度,壞處就是產生列表的時候會因為增加一條記錄從而需要所有相關的列表進行重構,當然不排除有的公司已經攻克的這個問題,但對於福士程式員來說,他依舊是個問題,而且產生的化對於中小型網站也不一定會比動態號,因為管理比較麻煩。
結構以上事實,然後偽靜態技術產生了,規範的說就是URL重寫技術,他對於ASPX格式支援最好,當然也可以重寫HTML格式的檔案,但這需要IIS的設定,相對比來說,ASPX格式的更方便,本站就是採用了該URL重寫技術,這個技術優點顯而易見:方便搜尋引擎收錄,方便查看,等等。那麼接下來我們來看看如何配置他吧
首先你要在你的項目裡引用兩個DLL:
URLRewriter.dll
ActionlessForm.dll
真正實現重寫的是 URLRewriter.dll 但是如果你要實現分頁,那麼必須使用這個ActionlessForm.dll
http://www.microsoft.com/web/spotlight/urlrewriter/
http://urlrewriter.net/
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><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>-->
</configuration>
設定完以上步驟,就基本可以運行了,其中<RewriterRule/>標籤裡面就是重寫的一個模組,<LookFor/>裡面的是重寫後的地址,而<SendTo/>則是原地址。3、配置IIS解析.html檔案
配置IIS6.0
IIS配置:網站->屬性 ->虛擬目錄->配置(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>成功!
這裡要注意一點,如果你想訪問http://網域名稱/C/303/168.html和訪問http://網域名稱/C/303/168.htm都是訪問同一個實際地址的話,而不會出現資源未找到的提示,需要在設定檔的<httpHandlers></httpHandlers>間加這樣一行代碼:<add verb="*" path="*.htm" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />;從這兒也能看出<LookFor></LookFor>)中URL後面檔案的副檔名需要在<httpHandlers></httpHandlers>中配置。
在頁面上加超連結也要注意了,超連結也要根據配置改了
<a href="<%=ResolveUrl("index.html") %>">首頁</a> (實際訪問的是default.aspx)
<a href="<%=ResolveUrl("I/158.html")%>">新聞動態</a> (實際訪問的是InfoList.aspx?id=158)
<a href="<%=ResolveUrl("C/378.html")%>" 關於我們</a> (實際訪問的是Content.aspx?id=378)
<a href="<%=ResolveUrl("C/381/167.html")%>">O,Yeah!</a> (實際訪問的是Content.aspx?id=381&Catalogid=167)
對於伺服器控制項請求的資源,可以使用“~/檔案路徑及檔案名稱”,而對於HTML控制項和元素,可以使用上面的方法。
五、解決回傳後真實路徑再現的問題
(你在頁面上加一個Button,運行後點下試試)
1、將ActionlessForm.dll添加到項目的bin檔案夾
2、在aspx網頁的代碼中加<%@ Register TagPrefix="RW" Namespace="ActionlessForm" Assembly="ActionlessForm" %>(載入Page命令後面一行吧)
3、然後將form標籤改為RW:Form(注意開始和結束都要改),TagPrefix可以自訂