UrlRewrite(Url重写技术)
ASP.NET偽靜態(tài) UrlRewrite(Url重寫) 實(shí)現(xiàn)和配置------轉(zhuǎn)載
ASP.NET偽靜態(tài) UrlRewrite(Url重寫) 實(shí)現(xiàn)和配置
核心提示:大家一定經(jīng)常在網(wǎng)絡(luò)上看到很多網(wǎng)站的地址后綴都是用XX.HTML或者XX.ASPX等類似靜態(tài)文件的標(biāo)示來(lái)操作的吧,那么大家有懷疑過(guò)他真的是一個(gè)一個(gè)的靜態(tài)生成的文件么,靜態(tài)文件的生成的優(yōu)缺有好有壞,對(duì)于訪問量很大的網(wǎng)站,利用靜態(tài)文件可提高服務(wù)器的運(yùn)行穩(wěn)定和速度...大家一定經(jīng)常在網(wǎng)絡(luò)上看到很多網(wǎng)站的地址后綴都是用XX.HTML或者XX.ASPX等類似靜態(tài)文件的標(biāo)示來(lái)操作的吧,那么大家有懷疑過(guò)他真的是一個(gè)一個(gè)的靜態(tài)生成的文件么,靜態(tài)文件的生成的優(yōu)缺有好有壞,對(duì)于訪問量很大的網(wǎng)站,利用靜態(tài)文件可提高服務(wù)器的運(yùn)行穩(wěn)定和速度,壞處就是生成列表的時(shí)候會(huì)因?yàn)樵黾右粭l記錄從而需要所有相關(guān)的列表進(jìn)行重構(gòu),當(dāng)然不排除有的公司已經(jīng)攻克的這個(gè)問題,但對(duì)于大眾程序員來(lái)說(shuō),他依舊是個(gè)問題,而且生成的化對(duì)于中小型網(wǎng)站也不一定會(huì)比動(dòng)態(tài)的號(hào),因?yàn)楣芾肀容^麻煩。
結(jié)構(gòu)以上事實(shí),然后偽靜態(tài)技術(shù)產(chǎn)生了,規(guī)范的說(shuō)就是URL重寫技術(shù),他對(duì)于ASPX格式支持最好,當(dāng)然也可以重寫HTML格式的文件,但這需要IIS的設(shè)置,相對(duì)比來(lái)說(shuō),ASPX格式的更方便,本站就是采用了該URL重寫技術(shù),這個(gè)技術(shù)優(yōu)點(diǎn)顯而易見:方便搜索引擎收錄,方便查看,等等。那么接下來(lái)我們來(lái)看看如何配置他吧
首先你要在你的項(xiàng)目里引用兩個(gè)DLL:
URLRewriter.dllActionlessForm.dll
真正實(shí)現(xiàn)重寫的是 URLRewriter.dll 但是如果你要實(shí)現(xiàn)分頁(yè),那么必須使用這個(gè)ActionlessForm.dll
URLRewriter.dll 1、下載文件 下載地址1:http://download.csdn.net/source/524514下載地址2:http://www.nmju.net/UserFiles/URLRewriter.rar
下載地址3:http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi
下載地址4:本站下載
2、配置WEB.CONFIG文件 在項(xiàng)目中引用這個(gè)程序集,偽靜態(tài)語(yǔ)法...(例把.aspx 的頁(yè)面 用.html來(lái)表示,web.config文件中--> 添加 以下節(jié)點(diǎn) <configuration>
??<configSections>?
????<section?name="RewriterConfig"?requirePermission="false"?type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,?URLRewriter"?/>?
??</configSections>?
??<RewriterConfig>?
????<Rules>?
??????<RewriterRule><!--一個(gè)參數(shù)->?
????????<LookFor>~/cn/ss_(.[\d]*)\.html</LookFor>?
????????<SendTo>~/cn/news.aspx?id=$1</SendTo>?
??????</RewriterRule>?
??????<RewriterRule><!--傳兩個(gè)參數(shù)的-->?
????????<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><!--三個(gè)參數(shù)-->?
????????<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>
-->
設(shè)置完以上步驟,就基本可以運(yùn)行了,其中<RewriterRule/>標(biāo)簽里面就是重寫的一個(gè)模塊,<LookFor/>里面的是重寫后的地址,而<SendTo/>則是原地址。
?
3、配置IIS解析.html文件 配置IIS6.0IIS配置:網(wǎng)站->屬性 ->虛擬目錄->配置(G)...->映射->通配符應(yīng)用程序映射->添加可執(zhí)行文件:c:\windows\microsoft.net\framework\v2.0.50727 \aspnet_isapi.dll
擴(kuò)展名為:.html
確認(rèn)文件是否存在:不選.
配置IIS7.5你的網(wǎng)站-->IIS中處理程序映射-->添加腳本映射(路徑:*.html 可執(zhí)行文件%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll 名稱:任意,比如Hml )
添加通配符腳本映射(路徑:* 可執(zhí)行文件:C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll 名稱:任意,比如All)
托管處理程序映射(路徑:* 可執(zhí)行文件:System.Web.UI.PageHandlerFactory 名稱 任意 比如Html-Integrate)-------->
IIS中 模塊-->添加---->(名稱:任意 如All 類型:URLRewriter.ModuleRewriter 把 僅針對(duì)向asp.net 應(yīng)用程序或托管處理程序發(fā)出請(qǐng)求調(diào)用 勾上 ok )
-->ok4、以上配置好之后就可以通過(guò)以下方式來(lái)訪問了
例如用戶輸入 hostname/d11.html,
服務(wù)器會(huì)把他重寫為http://hostname/default.aspx?id=11。
換句話說(shuō)用戶輸入http://hostname/d11.html,
實(shí)際訪問的是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);?
????????}?
????}?
}
創(chuàng)建此類并對(duì)其進(jìn)行編譯之后,要在 ASP.NET Web 應(yīng)用程序中使用它,應(yīng)首先將其添加到 Web 應(yīng)用程序的 References 文件夾中。然后,要 使用它來(lái)代替 HtmlForm 類,做法是在 ASP.NET 網(wǎng)頁(yè)的頂部添加以下內(nèi)容:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %> 然后,將 <form runat="server">(如果有)替換為: <skm:Form id="Form1" method="post" runat="server"> 并將右邊的 </form> 標(biāo)記替換為:</skm:Form>
?
成功! 虛擬主機(jī)在網(wǎng)上看到,很多朋友在asp.net中做urlrewrite,用的是HttpHandle+Server.Transfer的方法。其實(shí)這種方法是錯(cuò)誤的。
第一,HttpHandle是實(shí)現(xiàn)不了urlrewrite的;
第二Server.Transfer是標(biāo)準(zhǔn)的重定向,根本不是urlrewrite。
其實(shí),實(shí)現(xiàn)urlrewrite不用自己HttpHandle,也不用自己實(shí)現(xiàn)HttpModule,用幾行代碼就可以輕松實(shí)現(xiàn)。我這里介紹的是在虛擬主機(jī)上,虛擬主機(jī)不同于自己的服務(wù)器,你是沒有權(quán)限去修改iis,也沒有權(quán)限去安裝iis rewrite之類的iis插件。但是我們?nèi)匀豢梢暂p松完成需要的功能。具體做法如下:打開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);??
}??
}
有了上邊這段代碼,我訪問一個(gè)類似:.../default/123.aspx 的網(wǎng)址,當(dāng)然這個(gè)網(wǎng)址在我的電腦上不存在,它就會(huì)被定向到:.../default.aspx?id=123。
當(dāng)然,利用功能強(qiáng)大的正則表達(dá)式,你可以任意按照自己的需要來(lái)重寫url,這一切都是在服務(wù)器端默默的進(jìn)行,在客戶端是不會(huì)有任何察覺的。由于是在虛擬主機(jī)上,我們只能重定向.aspx文件,如果是自己的服務(wù)器,只要把后綴名在iis中注冊(cè)一下,就可以實(shí)現(xiàn)任意后綴名的處理。比如你可以注冊(cè)一個(gè)*.myweb這樣的類型,這樣別人訪問default/456.myweb時(shí),你可以把它重定向到default.aspx?id=456。總之一句話,只要你能想到,.net就可以幫你實(shí)現(xiàn),并且這一切不需要多少的代碼。
轉(zhuǎn)載于:https://www.cnblogs.com/yzenet/archive/2012/10/04/2711369.html
總結(jié)
以上是生活随笔為你收集整理的UrlRewrite(Url重写技术)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔试题 遗忘点记录 面向对象特点 + 产
- 下一篇: POJ 1904 【强连通分量】.cpp