文章类型: .NET
关键词: 虚拟主机,页面静态化,伪静态,真静态,页面重定向,SEO,IIS,UrlRewrite,HttpHandler,Server.Transfer
内容摘要: 主要介绍如何在虚拟主机上进行页面静态化处理,提高了两种解决方案,一种是伪静态,一种是折中静态页面,同时给出了关键代码提供参考...

页面静态化处理

2015/7/7 16:01:27    来源:apple    阅读:

    很多朋友在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进行配置,配置如下图所示:

1.jpg

需要注意:“确认文件是否存在”的复选框的选择去掉,因为我们要进行文件的判断处理,切记!

其实,实现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");

    如果需要进行加入文章的评论功能,则进行评论功能的追加与替换即可!

↑ 上一篇文章:关于数据丢失的通告 关键词:通告,数据,丢失 发布日期:2015/7/4 19:22:51
↓ 下一篇文章:如何发布网站之允许更新此预编译站点并且使用固定命名和单页程序集 关键词:.net,C#,网站发布,预编译站点,使用固定命名和单页.. 发布日期:2015/7/7 17:37:39
相关文章:
网站优化 关键词:网站优化,SEO,seo,信息技术,网络技术,网络推广,网络营销,网站运营,网站分析 发布日期:2015-07-20 17:34
IIS 没有对“*\Temporary ASP.NET Files”的写访问权限 解决 关键词:IIS,Temporary,ASP.NET,Files,写访问权限,解决 发布日期:2015-07-29 11:50
什么是网站建设 关键词:网站建设,网站开发,网站设计,网络公司,网页设计,网站制作,网站优化,SEO 发布日期:2015-07-20 17:22
相关目录:.NETJAVAHTML软件开发
我要评论
正在加载评论信息......