很多朋友在asp.net中做urlrewrite,用的是HttpHandle Server.Transfer的方法。其实这种方法是错误的。第一,HttpHandle是实现不了urlrewrite的;第二,Server.Transfer是标准的重定向,根本不是urlrewrite。而我这里使用的用Server.Transfer是为了实现真静态页面与伪静态页面的一种折中做法,本可以在HttpHandle中实现,此时需要在配置文件中添加HttpHandle处理静态页面的路径节点,即:
<configuration> <system.web> <httpHandlers> <add verb="*" path="*.html" type="HtmlHandler"/> </httpHandlers> </system.web> </configuration>
但考虑到此种方案需要在IIS中添加"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll"对".html"文件的Handler处理,默认情况下,IIS对静态页面及图片信息直接进行输出处理,不经过站点的Handler进行处理,所以需要对html进行配置,配置如下图所示:
需要注意:“确认文件是否存在”的复选框的选择去掉,因为我们要进行文件的判断处理,切记!
其实,实现urlrewrite不用自己HttpHandle,也不用自己实现HttpModule,用几行代码就可以轻松实现。
我这里介绍的是在虚拟主机上,虚拟主机不同于自己的服务器,你是没有权限去修改IIS(所以上面使用Handler的做法在虚拟主机上是行不通的,因为不会为一个客户去做专门的配置的),也没有权限去安装iis rewrite之类的IIS插件。但是我们仍然可以轻松完成需要的功能。在这里使用以下两种方案来做,如果服务器不支持伪静态重定向,如IIS rewrite插件,可以使用下面的做法,如果支持IIS rewrite的此类插件,则可以使用后面的那种做法来实现折中静态页面。
具体做法如下:打开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就可以帮你实现,并且这一切不需要多少的代码。
当然,如果您的虚拟主机支持伪静态的操作,譬如:在IIS中使用UrlRewrite。那么,什么是UrlRewrite? UrlRewrite是一个插件,将动态页面转换为静态页面的一种技术. 例如.您网站页面是 http://www.yourdomain.com/news/docread.aspx?id=123;为什么使用UrlRewrite,主要基于以下原因:
1) 处理这样的情形:你要更改你的web应用中网页的结构,但你同时也要确保在你移动网页后,那些被人收藏的老URL不会成为死链接。重写URL允许你透明地将请求转交到新的网页地址而不出错。
2)其次可以隐藏网站所用的编程语言,还可以提高网站的可移植性。当网站每个页面都挂着鲜明的.asp/.aspx/.php这种开发语言的标记,别人一眼即可看出你的网站是用什么语言做的。而且在改变网站的语言的时候,你需要改动大量的链接。而且,当一个页面修改了扩展名,它的pagerank也会随之消失,从头开始。我们可以用UrlRewrite技术隐藏我们的实现细节,这样修改移植都很方便,而且完全不损失pagerank。
3) 最重要的,在象Google,Yahoo 和 Live 这样的搜索引擎中提高你网站上网页的搜索相关性。具体来说,URL重写经常能使你在你网站上网页的URL里更加容易地嵌入关键词,这么做往往会增加别人点击你的链接的机会。
此时,你就可以根据default.aspx?id=456在此页面中获取id的进行内容的加载进行查询返回结果,如果要做成静态页面使下次不用再查询数据库,提高页面的访问速度,则可以先判断是否存在静态页面,如果存在,则使用Server.Transfer("~/article/" + id + ".htm")来执行此静态页面,否则进行页面的生成,关键代码如下:
string filePath = Server.MapPath("~/article/" + articleId + ".htm");//生成实际路径 Application.Lock();//加锁 if (!File.Exists(filePath)) { ArticleBlog article = new ArticleBlog(); article.ArticleID = articleId; string articleContent = ArticleBlogManager.GetArticleBlog(Server.MapPath("~/"), ref article);//根据文章ID获取 文章信息 string templatePath = string.Empty;//模板路径 if (article.IsHighLightCode) { templatePath = Server.MapPath("~/temp/高亮代码模板.htm"); } else { templatePath = Server.MapPath("~/temp/普通模板.htm"); } string template = "";//模板内容 using (StreamReader sr = new StreamReader(templatePath)) { template = sr.ReadToEnd();//读取模板内容 } /*模板内容替换*/ string html = template.Replace("[WebRootPath]", Request.ApplicationPath)//替换路径 .Replace("被替换部分", "替换部分"); using (StreamWriter sw = new StreamWriter(filePath, false, Encoding.UTF8)) { sw.Write(html);//写入静态化页面内容 } } Application.UnLock();//解锁 string err = string.Empty; ArticleBlogManager.AddArticleClickByArticleID(articleId, ref err);//增加点击数 Server.Transfer("~/article/" + articleId + ".htm");
如果需要进行加入文章的评论功能,则进行评论功能的追加与替换即可!