ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置
核心提示:大家一定经常在网络上看到很多网站的地址后缀都是用XX.HTML或者XX.ASPX等类似静态文件的标示来操作的吧,那么大家有怀疑过他真的是一个一个的静态生成的文件么,静态文件的生成的优缺有好有坏,对于访问量很大的网站,利用静态文件可提高服务器的运行稳定和速度...
大家一定经常在网络上看到很多网站的地址后缀都是用XX.HTML或者XX.ASPX等类似静态文件的标示来操作的吧,那么大家有怀疑过他真的是一个一个的静态生成的文件么,静态文件的生成的优缺有好有坏,对于访问量很大的网站,利用静态文件可提高服务器的运行稳定和速度,坏处就是生成列表的时候会因为增加一条记录从而需要所有相关的列表进行重构,当然不排除有的公司已经攻克的这个问题,但对于大众程序员来说,他依旧是个问题,而且生成的化对于中小型网站也不一定会比动态的号,因为管理比较麻烦。
结构以上事实,然后伪静态技术产生了,规范的说就是URL重写技术,他对于ASPX格式支持最好,当然也可以重写HTML格式的文件,但这需要IIS的设置,相对比来说,ASPX格式的更方便,本站就是采用了该URL重写技术,这个技术优点显而易见:方便搜索引擎收录,方便查看,等等。那么接下来我们来看看如何配置他吧
首先你要在你的项目里引用两个DLL:
ActionlessForm.dll
真正实现重写的是 URLRewriter.dll 但是如果你要实现分页,那么必须使用这个ActionlessForm.dll
http://www.microsoft.com/web/spotlight/urlrewriter/
2、配置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文件
例如用户输入 hostname/d11.html,
服务器会把他重写为http://hostname/default.aspx?id=11。
换句话说用户输入http://hostname/d11.html,
实际访问的是http: //hostname/default.aspx?id=11
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可以自定义