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

不同的鏈接指向的頁面如果具有大量相同的內容,這種現象就會被稱為重復內容,如果一個網站的重復內容很多,搜索引擎就會認為這個網站的價值不高。所以我們應盡量避免各種重復內容。

動態網站的重復內容常常是由URL參數引起的,而URL重寫會惡化這一現象(比較耐人尋味喲,呵呵)。因為如果使用的是原始的URL參數的話,搜索引擎可能會進行適當的判斷,而得知重復內容是由URL參數引起的,自動的進行相應的處理;而URL重寫會掩蓋URL參數,反而使得搜索引擎無法識別URL參數。比如:

原始的URL:
/articles.aspx?id=231catelog=blog
/articles.aspx?id=231catelog=news

經過URL重寫過後的URL:
/blog/231.html
/news/231.html

這些URL所指向的頁面內容其實是一樣的,都是id=231的那篇文章,但這篇文章被blog和news兩個欄目所引用,出於各種原因的考慮,我們最終的URL還是如上所示。

處理的辦法有兩種,一種是利用機器人(robot)協議排除其中一個,另一種是通過301將其中一個URL永久重定向另一個URL。

今天我們先講robot協議。簡單的講,robot指的就是搜索引擎,針對Google,我們又將其稱之為蜘蛛(spider)。蜘蛛是很有禮貌的,在抓取你的網頁內容的之前,會首先征求你的意見。而你和robot之前就基於robot協議進行溝通。具體到實現,有兩種方式:

1. 將一個的robots.txt文本添加到網站根目錄下,如:

#staticcontent,forbidallthepagesundertheAdminfolder
User-agent:*
Disallow:/Admin

#行表示註釋;

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

Disallow指定不允許訪問的目錄或頁面,註意:1. 此文本是大小寫敏感的;2.必須以\開頭,表示網站根目錄;

和本系列的宗旨一樣,我們著重談ASP.NET技術。所以更多的robots.txt文本的註意事項,請查看/2008/03/robotstxt.html

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

<%@WebHandlerLanguage=C#Class=Handler%>

usingSystem;
usingSystem.Web;

publicclassHandler:IHttpHandler{

publicvoidProcessRequest(HttpContextcontext){

HttpResponseresponse=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();
}

publicboolIsReusable{
get{
returnfalse;
}
}

}

一般處理程序實現瞭IHttpHandler,在前面UrlRewrite部分中,我們講到瞭HttpModule,其實在ASP.NET的應用程序生命周期中,有一個稱之為管道(pipeline)的概念:一個HTTP請求,經過一個有一個的HttpModule的過濾/處理,最終到達一個HttpHandle的處理器部分,HttpModule和HttpHandle就組成瞭一個管道,非常形象喲,呵呵。貼張圖吧: