ASP.NET的SEO:使用.ashx文件——排除重复内容

简介: 本系列目录  不同的链接指向的页面如果具有大量相同的内容,这种现象就会被称为“重复内容”,如果一个网站的重复内容很多,搜索引擎就会认为这个网站的价值不高。所以我们应尽量避免各种重复内容。动态网站的重复内容常常是由URL参数引起的,而URL重写会恶化这一现象(比较耐人寻味哟,呵呵)。

本系列目录

 

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

动态网站的重复内容常常是由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文件),代码如下:
img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
<% @ 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
img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
     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中详细讲解)
这是静态页面的效果,如果需要动态生成,也相当简单:
img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
     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
相关文章
|
8月前
|
开发框架 前端开发 .NET
asp.net 文件分片上传
asp.net 文件分片上传
99 0
asp.net 文件分片上传
|
开发框架 JavaScript 前端开发
ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件
ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件
435 0
ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件
|
开发框架 前端开发 .NET
ASP.NET Core单文件和多文件上传并保存到服务端
ASP.NET Core单文件和多文件上传并保存到服务端
|
开发框架 移动开发 前端开发
ASP.NET MVC中使用jQuery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径
ASP.NET MVC中使用jQuery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径
251 0
|
开发框架 前端开发 JavaScript
ASP.NET Core 2.1以上Bootstr ap4前端模板文件,开发环境与发布环境前端模板environment的使用
ASP.NET Core 2.1以上Bootstr ap4前端模板文件,开发环境与发布环境前端模板environment的使用
213 0
ASP.NET Core 2.1以上Bootstr ap4前端模板文件,开发环境与发布环境前端模板environment的使用
|
开发框架 .NET C#
ASP.NET Core 返回文件、用户 下载文件,从网站下载文件,动态下载文件
ASP.NET Core 返回文件、用户 下载文件,从网站下载文件,动态下载文件
497 0
|
存储 开发框架 前端开发
ASP.NET实现文件的上传和下载
最近做的一个高校网站中涉及到了上传和下载文件的需求(具体需求为:网站公布的通知,在后台要能给每个通知添加附件,在前台要能显示并下载附件),之前只是学习过关于上传的 理论知识,这里实践了一下下,与大家分享一下成果。
ASP.NET实现文件的上传和下载
|
开发框架 .NET Linux
ASP.NET Core: 十二.内置日志、使用Nlog将日志输出到文件(下)
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用。   ASP.NET Core提供了内置的日志,但没弄明白这么把它输出到文件, 只能在VS的输出中查看, 谁知道怎么弄告诉我一下。
268 0
|
开发框架 .NET C++
ASP.NET Core: 十二.内置日志、使用Nlog将日志输出到文件(上)
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用。   ASP.NET Core提供了内置的日志,但没弄明白这么把它输出到文件, 只能在VS的输出中查看, 谁知道怎么弄告诉我一下。
394 0
ASP.NET Core: 十二.内置日志、使用Nlog将日志输出到文件(上)