当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET教程:使用.ashx文件去除重复内容

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

ASP.NET教程:使用.ashx文件去除重复内容


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-03-17   浏览: 226 ::
收藏到网摘: n/a

不同的链接指向的页面如果具有大量相同的内容,这种现象就会被称为“重复内容”,如果一个网站的重复内容很多,搜索引擎就会认为这个网站的价值不高。所以我们应尽量避免各种重复内容。

动态网站的重复内容常常是由URL参数引起的,而URL重写会恶化这一现象(比较耐人寻味哟,呵呵)。因为如果使用的是原始的URL参数的话,搜索引擎可能会进行适当的判断,而得知重复内容是由URL参数引起的,自动的进行相应的处理;而URL重写会掩盖URL参数,反而使得搜索引擎无法识别URL参数。比如:

原始的URL:
http://www.freeflying.com/articles.aspx?id=231
&catelog=blog
http://www.freeflying.com/articles.aspx?id=231
&catelog=news

经过URL重写过后的URL:
http://www.freeflying.com/blog/231.html
http://www.freeflying.com/news/231.html

这些URL所指向的页面内容其实是一样的,都是id=231的那篇文章,但这篇文章被blog和news两个栏目所引用,出于各种原因的考虑,我们最终的URL还是如上所示。

处理的办法有两种,一种是利用机器人(robot)协议“排除”其中一个,另一种是通过301将其中一个URL永久重定向另一个URL。

今天我们先讲robot协议。简单的讲,robot指的就是搜索引擎,针对Google,我们又将其称之为“蜘蛛(spider)”。蜘蛛是很有礼貌的,在抓取你的网页内容的之前,会首先征求你的意见。而你和robot之前就基于robot协议进行沟通。具体到实现,有两种方式:

1. 将一个的robots.txt文本添加到网站根目录下,如:

#static content, forbid all the pages under the "Admin" folder
User-agent: *
Disallow: /Admin

#行表示注释;

User-agent指搜索引擎,*表示针对所有搜索引擎,也可以指定具体的搜索引擎,如User-agent: googlebot;

Disallow指定不允许访问的目录或页面,注意:1. 此文本是大小写敏感的;2.必须以“\”开头,表示网站根目录;

和本系列的宗旨一样,我们着重谈ASP.NET技术。所以更多的robots.txt文本的注意事项,请查看http://www.googlechinawebmaster.com/2008/03/robotstxt.html

但我们怎么动态的生成这个文件呢(这种需求其实蛮多的)?可能我们马上想到的就是I/O操作,在根目录下写一个txt文件……,但其实还可以有一种方法:使用一般处理程序(.ashx文件),代码如下:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;

public class Handler : IHttpHandler {
    
    
public void ProcessRequest (HttpContext context) {

        HttpResponse response 
= context.Response;
        
        response.Clear();
                
        
//response.ContentType = "text/plain";  如果要用IE6查看页面的话,不能这一条声明,原因不详
        
    
//下面这两句在实际使用中应该数据库等动态生成
        response.Write("User-agent: * \n");
        response.Write(
"Disallow: /news/231.html \n");

    
//引用一个静态的robots文件内容,里面存储不会改变的屏蔽内容
        response.WriteFile("~/static-robots.txt");

        response.Flush();
    }
 
    
public bool IsReusable {
        
get {
            
return false;
        }
    }

}

一般处理程序实现了IHttpHandler,在前面UrlRewrite部分中,我们讲到了HttpModule,其实在ASP.NET的应用程序生命周期中,有一个称之为“管道(pipeline)”的概念:一个HTTP请求,经过一个有一个的HttpModule的“过滤/处理”,最终到达一个HttpHandle的“处理器”部分,HttpModule和HttpHandle就组成了一个“管道”,非常形象哟,呵呵。贴张图吧:

如果你对它还比较陌生的话,查看Page的源代码,你会发现,Page也实现了IHttpHandler,所以*.aspx文件是最常用的HttpHandle。但Page不仅仅是一个HttpHandler,它还嵌入了复杂的页面生命周期事件,所以从节约资源的角度考虑,很多时候我也可以使用自定义的、更轻量级的*.ashx文件(),来完成一些简单的工作。和生成一个txt文件类似,我们还可以生成验证码(jpg文件),xml文件等。

然后还要做的一件事就是进行URLRewrite:

    void Application_BeginRequest(object sender, EventArgs e)
    {
        
// Code that runs on application startup
        HttpContext context = HttpContext.Current;
        
string currentLocation = context.Request.Url.LocalPath;

        
if (currentLocation.ToLower() == "/website1/robots.txt")
        {
            context.RewritePath(
"~/Handler.ashx");
        }

    }

这样,蜘蛛就会以为在网站的根目录下的确存在一个robots.txt文件。

2. 在需要屏蔽的页面META标签里加上

<meta id=“meta” name=“robots” content=“noindex,nofollow” />

noindex 意味着该页面不能被索引

nofollow 意味着该页面不能被“跟随”(将在SEO Hack中详细讲解)

这是静态页面的效果,如果需要动态生成,也相当简单:

    protected void Page_Load(object sender, EventArgs e)
    {
        HtmlMeta meta 
= new HtmlMeta();
        meta.Name 
= "robots";
        meta.Content 
= "noindex,nofollow";
        
this.Header.Controls.Add(meta);
    }

meta中还可以指定description、keyword等,其技术实现是相同的。

那么,两种方式我们如何选择呢?我的一些建议:

1. 尽量使用robots.txt,这既能降低网站的负载(虽然很小,呵呵),因为蜘蛛查看了robots.txt文件之后,就不会再请求被屏蔽的相关页面了;而如果使用meta方式,蜘蛛必须先请求该页面,再做出不检索的判断,这时Http请求已经发出了,服务器端的资源就已经浪费了;另外,如果过多的meta屏蔽,也会使蜘蛛对网站产生不佳的印象,减少或放弃该网站的检索收录;

2. robots.txt文本的匹配时从左到右的,这里就没什么正则匹配了!所以有的时候,我们不得不使用meta方式了。如我们文章开始的URL:

http://www.freeflying.com/blog/231.html

http://www.freeflying.com/news/231.html

最后,再讲一些注意事项:

1. 不要在所有页面使用相同的Keyword和Discription,这是我们很容易犯的一个错误,虽然articles.aspx是一个页面,但加上url参数后,就变成了成千上万个页面,如果你在页面上写死了Keyword和Discription,那将使这成千上万个页面都是一样的Keyword和Discription!

2. 尽量避免使用基于URL的SessionID。ASP.NET在客户端禁用cookie的情况下,可以设置使用基于URL的SessionID,效果类似:

http://www.freeflying.com/(S(c3hvob55wirrndfd564))/articles.aspx

作者:自由飞

原文链接:http://www.cnblogs.com/freeflying/archive/2010/02/21/1670758.html