不同的連結指向的頁面如果具有大量相同的內容,這種現象就會被稱為“重複內容”,如果一個網站的重複內容很多,搜尋引擎就會認為這個網站的價值不高。所以我們應盡量避免各種重複內容。
動態網站的重複內容常常是由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