通过 ASP.NET 4.0、Visual Studio 2010 和 IIS7 实现的搜索引擎优化
Scott Allen
任何拥有公共网站的人都知道,在吸引网站访问者方面,搜索引擎具有重要的作用。 要让搜索引擎发现并在其查询结果中排名靠前,这很重要。 较高的排名可以吸引更多访问者,从而带来更多付费客户和更高的广告收入。 搜索引擎优化 (SEO) 是网站优化做法,目的是在搜索结果中获得更高排名。 在本文中,我们将讨论在使用最新的 Microsoft Web 技术时可以应用的 SEO 做法。
SEO 基础
在搜索引擎计算网站相对排名时,有很多因素起作用,有些比较重要的因素并不受您直接控制。 例如,我们知道搜索引擎会查看您网站的传入链接。 传入链接是外部域上指向您的域的超链接。 当搜索引擎发现很多传入链接指向某一网站时,它会认为该网站有有趣或重要的内容,并相应地进行排名。 SEO 社区使用“链接汁”和“友情链接”这类技术术语描述这一现象。网站拥有的“链接汁”越多,在搜索结果中的排名就越高。
如果您的网站很吸引人,其他网站自然会开始链接您的网站。 Visual Studio 不提供“让网站更吸引人”这种功能,因此,您最终得靠自己的努力为网站增添值得链接的内容。
准备好优质的内容后,您将需要确保搜索引擎能够搜索到并处理这些内容。 我们不了解 Bing.com 和 Google 等搜索引擎使用的确切算法。 但大多数搜索引擎都公布了设计和内容指导,您可以遵照这些指导提升排名。 Internet 社区还汇集了大量通过反复尝试所获得的知识。
关键是:站在搜索引擎的角度思考问题。 搜索引擎不执行脚本,也不识别网站图像中的形状。 它们系统地跟踪链接,从而进行分析、编入索引并对发现的 HTML 内容排名。 站在搜索引擎的角度思考问题,您就会将注意力集中在 HTML 上。
快速有效的 HTML
Visual Studio 在桌面和 Web 方面都有很长的 WYSIWYG 开发历史。 使用 Web 窗体设计器可以在设计图面上拖放服务器控件,并在“属性”窗口中为控件设置值。 甚至不需要查看 HTML,您就可以快速创建网页。 但是,如果关注 HTML,您将需要在“源视图”窗口中工作。 令人高兴的是,在 Visual Studio 2010 中,您可以在源视图中工作而不影响速度和准确性。
Visual Studio 2010 将提供大量 HTML IntelliSense 代码段,使用这些代码段,在创建常见 HTML 标记和服务器端控件时,可以尽量减少击键次数。 例如,在 .aspx 文件的源视图中,键入 img 然后按 Tab 键,就可以生成图 1 中所示的标记。 只需四次击键就实现了需要键入 20 多个字符才能实现的效果!
请注意图 1 中编辑器突出显示 src 和 alt 值的方式。 使用代码段时,您可以通过 Tab 键在突出显示的区域间切换,开始键入即可覆盖其中的值。 这项功能也可提升效率,减少了导航到适当插入点手动删除现有值所需的工作量。
在 Visual Studio 2010 中,ASP.NET Web 窗体和 ASP.NET MVC 项目都提供 HTML 代码段,可以用来创建从 ActionLink 到 XHTML DOCTYPE 声明的任何内容。 这些代码段可进行扩展、可进行自定义,它们基于自 Visual Studio 2005 就提供的代码段引擎。 有关代码段的更多详细信息,请参见 Lorenzo Minore 的 MSDN 文章 (msdn.microsoft.com/en-us/magazine/cc188694.aspx).
图 2 验证设置
验证
如果希望搜索引擎将您的站点编入索引,创建有效的 HTML 非常关键。 Web 浏览器要求不严格,会尽其所能显示 HTML 格式不正确的页面,但是,如果搜索引擎发现无效的 HTML,会跳过重要内容或放弃整个页面。
由于有不同版本的 HTML 规范,应用程序实现的每个页面都应包含 DOCTYPE 元素。 DOCTYPE 元素指定页面所使用的 HTML 版本。 Web 浏览器、搜索引擎和其他工具将检查 DOCTYPE 以确定如何解释标记。 创建新的 Web 窗体页和母版页时,Visual Studio 会在适当的位置放置 DOCTYPE。 默认的 DOCTPYE(如下面的代码段所示)指定页面遵守 XHTML 1.0 规范:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
尽管不需要知道 HTML 规范间的细微差别,但您必须知道页面是否符合某一特定 DOCTYPE。 Visual Studio 自 2005 版起,就提供 HTML 验证功能,默认情况下,验证功能为启用状态。 您可以控制验证设置和验证目标类型,方法是导航到“工具”|“选项”|“文本编辑器”|“HTML”|“验证设置”(如图 2 所示)。
“作为警告”设置表示 HTML 验证问题不会导致停止生成,但将在 Visual Studio 的“错误”窗口中显示为警告。 在 Web 窗体的源视图中,文本编辑器使用波浪线提醒您注意 HTML 验证错误。 您可以将鼠标悬停在元素上查看确切的错误消息,如图 3 所示。
描述性 HTML
图 3 中的 img 标记很好地说明了为何需要像搜索引擎一样思考。 如前所述,搜索引擎不查看或解释图像中的形状和字词,但我们可以使用 alt 属性向搜索引擎提供一些关于图形内容的附加信息。 如果图像是公司徽标,则 alt 文本可以是“公司徽标”,但在徽标的 alt 文本中加上公司名称会更好。 搜索引擎将 alt 文本用作另一个线索来了解页面的主题和实际内容。
搜索引擎始终在查找这类线索,对于搜索引擎来说,某些线索比其他线索更为重要。 例如,我们通常使用标头标记(如 h1 标记)在页面中突出某些内容。 通常,搜索引擎对 h1 标记中的关键字会给予比普通段落中的该关键字更多的权重。 您应确保 h1 内容是描述性的,并使用与页面主题相关的关键字。 SEO 工作的一种最佳做法是始终在每个页面中包含至少一个 H1 标记。
回顾一下我为本文选择的标题,就会发现它们包含“有效的 HTML”、“SEO 基础”等词语。 这些都是一些描述性词语,可以很好地为读者和搜索引擎提供文章内容信息。
描述性标题和元数据
另一个需要使用描述性关键字的区域在 head 标记内。 关联代码下载中某一页面的 head 部分如下所示:
<head runat="server"> <title>Programming meta tags in ASP.NET 4.0</title> <meta name="keywords" content="ASP.NET, ASP.NET 4.0, SEO, meta" /> <meta name="description" content= "How to use Page.MetaKeywords and Page.MetaDescription in ASP.NET" /> </head>
页面 title 标记中的词具有很高的权重,因此需要选择适当的标题。 head 标记还可以包含 meta 标记。 要进行 SEO 工作,可以使用两个 meta 标记 — 一个用于设置页面的关联关键字,一个用于设置页面的描述。 访问者一般看不到这些 meta 信息,但某些搜索引擎会在搜索结果中显示页面的 meta 描述。 通过为搜索引擎提供重要字词与页面关联,meta 关键字也可以宣传页面的实际内容。
如果要频繁生成动态内容或更改 title 和 meta 数据,则不要在 .aspx 文件中对这些内容进行硬编码。 幸运的是,使用 ASP.NET 4.0 中的 Web 窗体可以轻松通过代码隐藏操作标题、关键字和页面描述:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Page.Title = "Programming meta tags in ASP.NET 4.0"; Page.MetaKeywords = "ASP.NET 4.0, meta, SEO, keywords"; Page.MetaDescription = "How to use Page.Keywords and Page.Description in ASP.NET"; } }
您可以了解在 Page_Load 事件中如何使用页面的 Title、MetaKeywords 和 MetaDescription 属性。 自 2.0 版起,ASP.NET 就提供 Title 属性,但 MetaKeywords 和 MetaDescription 是 ASP.NET 4.0 新增的功能。 尽管我们仍使用硬编码字符串,您还是可以从任意数据源加载这些属性值。 然后您可以让其他人负责网站营销,调整元数据以实现最佳搜索引擎结果,而他们不必编辑页面的源代码。
尽管有效的关键字和描述可以对搜索引擎结果起一点作用,但内容仍然是最重要的。 本文稍后还将介绍更多 HTML 技巧,不过,下面几部分将介绍 URL 在内容的查找和排名方面的重要作用。
规范 URL
重复内容通常会引起搜索引擎方面的问题。 例如,假定搜索引擎在两个不同 URL 中找到了著名的 tacos 食谱。 搜索引擎会优先选择哪个 URL 并在搜索结果中提供链接呢? 对于传入链接而言,重复问题更是一个优化问题。 如果 tacos 食谱的“友情链接”分布在两个不同的 URL 上,那您的著名 tacos 食谱可能就得不到应有的搜索引擎排名。
很遗憾,您复制内容的时候可能没有意识到这一点。 如果搜索引擎从带 www 前缀和不带 www 前缀的 URL 发现您的站点,则会在两个不同的 URL 下看到同样的内容。 您需要使两个 URL 都起作用,但只需要使一个 URL 是标准或规范 URL。
举例来说,考虑一下 Microsoft.com 网站。 www.microsoft.com 和 microsoft.com 向您提供相同的内容。 但是,请注意,如果使用 microsoft.com 进入主页, Microsoft 站点会将您的浏览器重定向到 www.microsoft.com。 Microsoft 使用重定向强制将 www.microsoft.com 作为其规范 URL。
幸运的是,使用 ASP.NET 可以轻松将访问者重定向到您的规范 URL。 您需要做的只是在应用程序管道的 BeginRequest 事件期间提供某种逻辑。 通过实现自定义 HTTP 模块,或在 global.asax 中使用 Application_BeginRequest 方法,都可实现这一目的。 用于此功能的逻辑如图 4 所示。
图 4 中的代码使用了 ASP.NET 4.0 中的又一新功能 — HttpResponse 对象的 RedirectPermanent 方法。 ASP.NET 中传统的 Redirect 方法将一个 HTTP 状态代码 302 发回客户端。 302 告诉客户端,资源已临时移到新的 URL,客户端仅这一次应转到新 URL 查找资源。 RedirectPermanent 方法将一个 301 代码发送到客户端。 301 告诉客户端,资源已永久移动,以后所有请求都应在新 URL 查找资源。 请注意,对 RedirectPermanent 的调用还使用了 C# 4.0 中的新功能 — 命名参数语法。 尽管此语法不是方法调用所必需的,但命名参数语法使得参数的目的更为明确。
使用重定向机制后,Web 浏览器和搜索引擎都会只使用您的规范 URL。 您的“友情链接”将得到加强,搜索引擎排名也会获得提升。
描述性 URL
图 4 HttpResponse 对象的 RedirectPermanent 方法
void Application_BeginRequest(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; if (app != null) { string domain = "www.odetocode.com"; string host = app.Request.Url.Host.ToLower(); string path = app.Request.Url.PathAndQuery; if (!String.Equals(host, domain)) { Uri newURL = new Uri(app.Request.Url.Scheme + "://" + domain + path); app.Context.Response.RedirectPermanent( newURL.ToString(), endResponse: true); } } }
在 2009 年 1 月月刊的 MSDN Magazine编写有关如何使用 ASP.NET Web 窗体 (msdn.microsoft.com/en-us/magazine/2009.01.extremeaspnet.aspx) 使用的.NET 3.5 SP1 路由功能。 文章中说,通过路由实现清洁的描述性 URL,这对用户和搜索引擎而言非常重要。 在 /recipes/tacos 这样的 URL 中,用户和搜索引擎都可以获得比 /recipe.aspx?category=40&topic=32 更多的信息。 在前一种方式下,搜索引擎将“recipes”和“tacos”作为资源的重要关键字。 后一个 URL 的问题在于,如果 URL 需要具有多个参数的查询字符串,则不利于很多搜索引擎爬网程序进行工作,而且查询字符串中的数字在应用程序后端数据库之外没有任何意义。
ASP.NET 团队向 4.0 版本添加了一些类,使得 Web 窗体路由更为轻松。 的代码下载中,我已使用 ASP.NET 4.0 中的新类重新实现了 1 月期中的演示网站。 路由是通过描述应用程序在 Application_Start 事件中将处理的路由开始的。 下面的代码是 global.asax 中该站点在 Application_Start 事件期间调用的 RegisterRoutes 方法:
void RegisterRoutes() { RouteTable.Routes.Add( "Recipe", new Route("recipe/{name}", new PageRouteHandler("~/RoutedForms/RecipeDisplay.aspx", checkPhysicalUrlAccess:false))); }
图 5 从 RouteData 获取 Name 参数以显示关于食谱的信息
private void DisplayRecipe() { var recipeName = RouteData.Values["name"] as string; if (recipeName != null) { var recipe = new RecipeRepository().GetRecipe(recipeName); if (recipe != null) { _name.Text = recipe.Name; _ingredients.Text = recipe.Ingredients; _instructions.Text = recipe.Instructions; } } }
回顾我在 1 月期发表的文章,您会记起为什么每个路由都必须指定一个路由处理程序。 在 RegisterRoutes 中,我们将“Recipe”路由的处理程序设置为 ASP.NET 4.0 中的一个新类 PageRouteHandler 的实例。 路由引擎会将所有 recipe/{name} 形式的传入请求 URL 定向到此路由处理程序,其中 {name} 表示路由引擎将从该 URL 提取的路由参数。
Web 窗体可以通过 RouteData 属性访问路由引擎从该 URL 提取的所有路由参数。 此属性是 4.0 中 Page 类的新增属性。 图 5 中的代码将从 RouteData 中获取 name 参数,然后使用该名称查找并显示关于食谱的信息:
路由引擎的重要特征之一是它具有双向特性。 路由引擎不但能分析 URL 来管理 HTTP 请求,还可以生成 URL 来访问特定页面。 例如,如果要创建一个将访问者引导至 tacos 食谱的链接,可以使用路由引擎根据路由配置生成一个 URL(而不是硬编码该 URL)。 ASP.NET 4.0 引入了一个新的表达式生成器,您可以在标记中用它根据路由配置表生成 URL:
<asp:HyperLink NavigateUrl="<%$ RouteUrl:RouteName=recipe,name=tacos %>" Text="Titillating Tacos" runat="server"> </asp:HyperLink>
前面的代码说明操作中的新 RouteUrl 表达式生成器。 此表达式生成器告诉路由引擎为名为“recipe”的路由生成一个链接,并在 URL 中包含一个值为“tacos”的 name 参数。 上述标记将生成下面的 HTML:
<a href="/recipe/tacos">Titillating Tacos</a>
上面的 URL 是友好的、描述性的且针对搜索引擎进行了优化。 但是,此示例引出了一个更大的关于 ASP.NET 的问题。 Web 窗体的服务器控件经常抽象出它们所生成的 HTML,并且不是 ASP.NET 中的所有服务器控件对搜索引擎都是友好的。 现在,我们该继续谈谈 HTML 了。
HTML 错误
如果我们使用 LinkButton(而不是 Hyperlink)创建指向 tacos 食谱的链接,我们会在浏览器中发现使用了不同的标记。 LinkButton 的代码和它生成的 HTML 如下所示:
<asp:LinkButton runat="server" Text="Tacos" PostBackUrl="<%$ RouteUrl:RouteName=recipe,name=tacos %>"> </asp:LinkButton> <!-- generates the following (excerpted): --> <a href="javascript:WebForm_DoPostBackWithOptions(...)">Tacos</a>
我们仍然有一个定位标记供用户单击,但该定位标记使用 JavaScript 强制浏览器回发到服务器。 LinkButton 呈现此 HTML 是为了在用户单击该链接时引发服务器端 Click 事件。 很遗憾,JavaScript 回发导航和搜索引擎不能协作。 该链接实际上对搜索引擎是不可见的,搜索引擎肯定找不到目标页面。
图 6 IIS 7 管理器
因为服务器端 ASP.NET 控件会抽象出 HTML,所以您必须正确选择服务器控件。 如果要在 ASP.NET 环境中完全控制 HTML 标记,应考虑使用 ASP.NET MVC 框架。 在使用 MVC 框架时,是不能使用服务器控件的,基础结构和 API 只能用于 HTML 标记。
如果要使用 ASP.NET Web 窗体并针对搜索引擎进行优化,可以查看由服务器控件生成的 HTML 源。 每个 Web 浏览器都会提供此选项。 在 Internet Explorer 中,使用“查看”->“源文件”命令。 请注意在导航方案中呈现 HTML 和 JavaScript 组合的所有控件。 例如,如果使用 AutoPostBack 属性设置为 true 的 DropDownList,则需要 JavaScript 才能正常运行。 如果依赖于自动回发导航到新内容,则会使这些内容对搜索引擎不可见。
显然,采用较多 AJAX 技术的应用程序会引起搜索引擎方面的问题。 UpdatePanel 控件和从 JavaScript 调用的 Web 服务所生成的内容对于搜索引擎并不友好。 进行 SEO 工作的最安全的方法,是将内容直接放入 HTML,以便搜索引擎能够找到它。
调整 HTML、关键字和 URL 后,如何衡量结果? 尽管搜索引擎排名是对 SEO 工作的最终判断,不过,仍然建议您在站点发布和搜索引擎对您的页面进行爬网处理之前发现所有问题。 Visual Studio 会提醒您注意 HTML 验证问题,但它不会就缺少元数据和规范 URL 给出警告。 这是新产品 (IIS SEO Toolkit) 的工作。
图 7 报告摘要
IIS SEO Toolkit
在 IIS SEO 工具包 IIS 7 的免费下载,可以从 iis.net/extensions/SEOToolkit。 该工具包提供一个爬网引擎,该引擎像搜索引擎一样将本地 Web 应用程序编入索引,并提供详细的站点分析报告。 该工具包还可以管理 robots.txt 和 sitemap 文件。 robots 文件以标准化格式通知搜索引擎哪些是不编入索引的内容,而 sitemap 文件可以将搜索引擎引导至要编入索引的内容。 您还可以使用 sitemap 文件向搜索引擎提供资源更改的优先级、更改率和日期。
对于 SEO 工作,站点分析报告非常有用。 此报告可从搜索引擎的角度提供关于站点的所有信息。 安装该工具包后,IIS 7 管理器窗口中将为站点显示“Site Analysis”选项,如图 6 所示。
双击该图标,则会显示以前运行的报告的列表,并提供一个用于运行新分析的“Action”选项。 运行分析非常简单,需要的操作只是使该工具指向本地 HTTP URL,然后单击“确定”。 分析完成后,工具包将打开报告摘要,如图 7 所示。
该工具包应用大量规则和试探法,以发现与 SEO 和性能相关的问题。 您可以找到中断的链接、缺失的标题、过短的描述、过长的描述以及大量其他潜在问题。 该工具包分析链接并提供报告,报告内容包括链接最多的页面和访问者访问特定页面需使用的路径方面的信息。 该工具包甚至针对每个页面的内容提供逐字分析。 您可以使用逐字分析功能为页面查找最佳关键字。
使用 IIS SEO Toolkit 可以发现需要进行的 SEO 工作,还可以验证已完成的所有 SEO 工作。 撰写本文时,该工具包提供 Beta 1 版本。 除了某些可自动修复特定问题的智能功能外,未来的新版本将继续增加规则和分析功能。
简单高效
即使有世界上最优质的内容,也需要搜索引擎将它们展现给访问者。 SEO 是像搜索引擎一样思考的做法,能增强您的站点对爬网程序和排名算法的吸引力。 Visual Studio 2010 和 ASP.NET 4.0 引入了一些新功能,使得在 .NET 4.0 中进行 SEO 工作更为轻松,而 IIS SEO Toolkit 是一款很好的工具,可使站点更好地配合搜索引擎。 通过组合使用这三种工具,可以简单高效地进行 SEO 工作。
*************************
Xiang Xiang
QQ:86527965
*************************