天天看點

ASP.NET的SEO:使用.ashx檔案——排除重複内容

<a target="_blank" href="http://www.cnblogs.com/freeflying/archive/2010/02/19/1669484.html">本系列目錄</a>

不同的連結指向的頁面如果具有大量相同的内容,這種現象就會被稱為“重複内容”,如果一個網站的重複内容很多,搜尋引擎就會認為這個網站的價值不高。是以我們應盡量避免各種重複内容。

ASP.NET的SEO:使用.ashx檔案——排除重複内容

原始的URL:

http://www.freeflying.com/articles.aspx?id=231&amp;catelog=blog

http://www.freeflying.com/articles.aspx?id=231&amp;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.必須以“\”開頭,表示網站根目錄;

但我們怎麼動态的生成這個檔案呢(這種需求其實蠻多的)?可能我們馬上想到的就是I/O操作,在根目錄下寫一個txt檔案……,但其實還可以有一種方法:使用一般處理程式(.ashx檔案),代碼如下:

ASP.NET的SEO:使用.ashx檔案——排除重複内容
ASP.NET的SEO:使用.ashx檔案——排除重複内容

代碼

&lt;%@ WebHandler Language="C#" Class="Handler" %&gt;

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就組成了一個“管道”,非常形象喲,呵呵。貼張圖吧:

ASP.NET的SEO:使用.ashx檔案——排除重複内容

如果你對它還比較陌生的話,檢視Page的源代碼,你會發現,Page也實作了IHttpHandler,是以*.aspx檔案是最常用的HttpHandle。但Page不僅僅是一個HttpHandler,它還嵌入了複雜的頁面生命周期事件,是以從節約資源的角度考慮,很多時候我也可以使用自定義的、更輕量級的*.ashx檔案(),來完成一些簡單的工作。和生成一個txt檔案類似,我們還可以生成驗證碼(jpg檔案),xml檔案等。

ASP.NET的SEO:使用.ashx檔案——排除重複内容
ASP.NET的SEO:使用.ashx檔案——排除重複内容

    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标簽裡加上

&lt;meta id="meta" name="robots" content="noindex,nofollow" /&gt;

noindex 意味着該頁面不能被索引

nofollow 意味着該頁面不能被“跟随”(将在SEO Hack中詳細講解)

這是靜态頁面的效果,如果需要動态生成,也相當簡單:

ASP.NET的SEO:使用.ashx檔案——排除重複内容
ASP.NET的SEO:使用.ashx檔案——排除重複内容

    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:

最後,再講一些注意事項:

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