站点地图类型
有 3 种不同类型的“站点地图”。
- 带有链接的页面,可以为用户提供网站结构的完整概要,从而为用户提供帮助。有时,但并非总是如此,遵循站点层次结构。此外,它通常仅限于网站的主要类别。通常不会列出详细信息页面。
- ASP.NET 中的一个系统,有助于构建菜单、面包屑路径和网站的其他导航功能。这是由默认情况下使用的提供程序驱动的
.sitemap
XML 文件。
- 一个 XML 文档,提供网站页面的链接以及有关页面上次更新时间、更新的重要性等信息,以帮助在搜索引擎中对网站建立索引。
一个简短的历史
如果您查看历史记录,就会使解析此信息变得不那么混乱。上面的列表是按时间顺序排列的。 “站点地图”这个术语最初是为了提供链接到网站主要部分的用户页面。 Microsoft 决定再次使用术语“站点地图”来指代 ASP.NET 2.0 的导航系统。几年后,主要的搜索引擎联手提供了 XML 规范,用于提供有关站点的 URL 信息,但不幸的是,它们再次超载了术语“站点地图”来描述它们。
这段历史的后果之一是 ASP.NET 已经没有对 XML 站点地图的内置支持,听起来您正在尝试根据您的问题进行制作。这主要是因为 Microsoft 的实现自 ASP.NET 2.0 以来没有发生太大变化,并且它是在该规范实现之前编写的。因此,使用 Microsoft 的 ASP.NET 导航系统对于生成 XML 站点地图没有任何好处。
搜索引擎优化考虑因素
但请注意all 3这些项目对于 SEO 很重要。
- 用户站点地图有助于搜索引擎索引,因为它提供了指向需要索引的主要区域的内部站点链接。
- 菜单和面包屑路径对于将所有内容页面相互链接起来非常重要,这有助于识别网站不同部分之间的相关性。
- XML 站点地图为搜索引擎提供直接的 URL 信息,有助于减少网站上的搜索引擎流量,并帮助确保搜索引擎不会忽略任何重要的 URL 来建立索引。
因此,您可能需要考虑其中的每一个,尽管严格来说所有这些都是可选的。
SEO 首先是提供好的内容,然后执行所需的步骤,以便内容易于访问。上述每一个步骤都应该被视为 SEO 的一个进步,如果您真的关心搜索引擎的排名,您应该采取一切可能的措施,包括所有这 3 个步骤。
XML站点地图推荐
事实上,XML 站点地图规范 http://www.sitemaps.org/protocol.html对于 50,000 页以下的小型网站来说非常简单。因此,将它们组合在一起通常不需要花费太多精力。您可能需要考虑自己这样做。
大多数开源实现的可扩展性都不是很好,因为它们都将整个数据集一次性加载到内存中以生成 XML,而不是流式传输。此外,它们中的大多数并没有真正考虑到您可能在多个表中拥有动态数据,而这些数据都对网站的 URL 做出了贡献。他们通常让您来提供寻呼。大多数现有的实现也不提供专门的内容类型 http://searchengineland.com/google-xml-sitemaps-now-supports-multiple-types-is-the-sitemaps-alliance-over-45406由谷歌提供。
我最近创建了一个实现 https://github.com/NightOwl888/MvcSiteMapProvider/tree/prototype-xml-sitemaps它可以完成所有这些事情。它尚未正式发布,目前是Mvc站点地图提供者 https://github.com/maartenba/MvcSiteMapProvider项目。我们计划将 XML 站点地图功能分离到不同的程序集(以及单独的 NuGet 包)中,这样就可以在不引用 MVC 的情况下使用它,但目前 MVC 是必需的(当然,除非您想要获取所有相关类型并编译它们)自己编写成一个单独的 DLL)。包含 MVC 的 ASP.NET 项目仍然可以正常运行,因此对于大多数项目来说这并不是什么大问题。
目前还没有任何文档,但我已经创建了一个快速发帖 https://stackoverflow.com/questions/28297293/how-to-link-to-a-child-site-map-file-from-a-parent-site-map-in-asp-net-mvc4-usin/28330749#28330749展示如何在 MVC 中连接它,包括一个演示应用程序。
对于 ASP.NET,您可以使用 MVC 实现(如果您安装了 MvcSiteMapProvider,它无论如何都会将 MVC 安装到您的项目中),或者您可以只使用 ASP.NET 页面。
在第二种情况下,配置看起来相似,但有一些例外。
- 您不需要使用
XmlSitemapFeedRouteRegistrar
class.
- 您(当然)不需要使用控制器,您可以将其替换为 ASP.NET 页面,如下所示:
Xml站点地图.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="XmlSitemap.aspx.cs" Inherits="XmlSitemap" %>
XmlSitemap.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MvcSiteMapProvider.IO;
using MvcSiteMapProvider.Xml.Sitemap;
using MvcSiteMapProvider.Xml.Sitemap.Configuration;
public partial class XmlSitemap : System.Web.UI.Page
{
private HttpContextBase HttpContext
{
get { return new HttpContextWrapper(System.Web.HttpContext.Current); }
}
private int PageNumber
{
get
{
var pageString = HttpContext.Request.QueryString["page"];
if (!string.IsNullOrEmpty(pageString))
{
int page;
if (int.TryParse(pageString, out page))
{
return page;
}
}
return 0;
}
}
private string FeedName
{
get
{
var feedName = HttpContext.Request.QueryString["feedName"];
if (!string.IsNullOrEmpty(feedName))
{
return feedName;
}
return "default";
}
}
protected void Page_Load(object sender, EventArgs e)
{
// Build feeds for XML sitemap
var xmlSitemapFeedStrategy = new XmlSitemapFeedStrategyBuilder()
.SetupPageNameTempates(templates => templates
.WithDefaultFeedRoot("XmlSitemap.aspx?feedName={feedName}&page={page}")
.WithDefaultFeedPaged("XmlSitemap.aspx?feedName={feedName}&page={page}")
.WithNamedFeedRoot("XmlSitemap.aspx?feedName={feedName}&page={page}")
.WithNamedFeedPaged("XmlSitemap.aspx?feedName={feedName}&page={page}"))
.AddDefaultFeed()
.AddNamedFeed("google", feed => feed.WithContent(c => c.Image().Video()))
// Optional - add news feed (will be at ~/XmlSitemap.aspx?feedName=news)
.AddNamedFeed("news", feed => feed.WithContent(c => c.News()))
// Optional - add mobile feed (will be at ~/XmlSitemap.aspx?feedName=mobile)
.AddNamedFeed("mobile", feed => feed.WithContent(c => c.Mobile()).WithMaximumPageSize(10000))
.Create();
var xmlSitemapFeed = xmlSitemapFeedStrategy.GetFeed(this.FeedName);
if (xmlSitemapFeed != null)
{
var outputCompressor = new HttpResponseStreamCompressor();
var response = HttpContext.Response;
response.Clear();
// Output content type
response.ContentType = "text/xml";
using (var stream = outputCompressor.Compress(HttpContext))
{
if (!xmlSitemapFeed.WritePage(this.PageNumber, stream))
{
response.Clear();
//Return 404 not found
response.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
response.StatusDescription = "Page Not Found";
}
}
response.End();
}
}
}
上面的配置实际上创建了 4 个不同的 XML 站点地图提要,主要是为了遵守这些专用类型的规范。
- 默认 -
/XmlSitemap.aspx
- 可与任何搜索引擎一起使用的站点地图。此 URL 需要位于您的robots.txt
文件按照XML 站点地图规范 http://www.sitemaps.org/protocol.html#submit_robots.
- 谷歌 -
/XmlSitemap.aspx?feedName=google
- 此站点地图包含与默认值相同的 URL,但还包含图像和视频专门内容。由于编码不正确的爬虫如果遇到 Google 的任何专门类型可能会崩溃,因此我将它们分成了不同的提要。您需要通过 Google 的网站管理员工具手动将此 URL 提交给 Google。
- News -
/XmlSitemap.aspx?feedName=news
- 这是针对Google的新闻站点地图功能,需要提交根据他们的规格 https://support.google.com/news/publisher/answer/74288?hl=en.
- 移动的 -
/XmlSitemap.aspx?feedname=mobile
- 这是针对Google的移动站点地图功能,需要提交.
请注意,也可以在 ASP.NET 中使用路由来使这些 URL 变得更好。您只需要确保上面指定的名称模板与路由生成 URL 的方式相同,将占位符放在{feedName}
and {page}
在 URL 中的适当位置。
请注意,根据 XML 站点地图规范,XML 站点地图不能包含其虚拟目录之上的目录的任何 URL。因此,最好确保您的路线不包含任何/
字符(意味着它适用于整个站点,而不是子目录)。