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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-03-17   浏览: 236 ::
收藏到网摘: 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