ASP.NET 站点地图,有多重要?

ASP.NET sitemap , how important?

我的网站已经完成了,至少我是这么想的。我没有站点地图,而且奇迹般地我错过了站点地图的整个概念,甚至不知道它是一回事。我猜想对我的 CS 老师大声喊叫。

我一直在阅读它,动态生成站点地图似乎相当复杂,我必须这样做,因为我的页面基本上只是一个大数据库,您可以在其中使用参数进行搜索。

这对于 Google 搜索引擎相关性等有多重要?例如,如果有人像这样 "www.mySite.com food" 在 google 上搜索我的网站。如果我的数据库中有一个名为 "food" 的类别,并且确实如果有人在我的网站上使用搜索,他们会找到一个食品类别,但 Google 会知道吗? Google 会找到 "www.mySite.com/Find?Result=food" 吗?

编辑:使用可以在 ASP.NET 中创建的 Web.Sitemap 是否正确,或者我应该使用名为 sitemap.txt 的文件吗?

首先,没有。 asp.net 站点地图并不是您真正用于 Google 的站点地图。这更多是为了提供信息。大多数搜索引擎都接受一个站点地图文件,作为更好地了解您的站点的一种方式。有很多免费和付费服务可以为您生成它。只需 Google "sitemap generator",您就会发现种类繁多。这些将抓取您的网站,找到 link,组织它们,并在主要搜索引擎的 XML 站点地图中为您提供文件。

Google 不会去查找类别,因此除非您 link 在某个地方找到它,否则它不会知道食物。您可能还想看看使用 url 重写而不是查询字符串变量,因为它可以改进 SEO。您的 url 将是: www.mysite.com/Find/Food,对搜索引擎更友好。

简而言之,asp.net 站点地图很好,但旨在供其他数据组件使用,为用户创建诸如菜单或可视站点地图之类的内容,而不是用于搜索的站点地图定义文件引擎。

站点地图类型

有3种不同的"site maps"。

  1. 一个包含 link 的页面,通过为用户提供网站结构的完整轮廓来帮助他们。这有时但并非总是遵循站点层次结构。此外,它通常仅限于网站的主要类别。通常不会列出详细信息页面。
  2. ASP.NET 中的一个系统,有助于构建网站的菜单、面包屑路径和其他导航功能。这是由默认使用 .sitemap XML 文件的提供程序驱动的。
  3. 一个 XML 文档,为站点页面提供 links 以及有关页面上次更新时间、更新的重要性等信息,以帮助索引站点在搜索引擎中。

简史

如果您查看历史记录,那么解析这些信息就不会那么混乱了。以上名单按时间顺序排列。 "Site map" 是一个最初用于提供用户页面的术语,该页面 linked 到网站的主要部分。 Microsoft 决定再次使用术语 "site map" 来指代其 ASP.NET 2.0 的导航系统。几年后,各大搜索引擎联合起来提供了一个 XML 规范来提供 URL 有关站点的信息,不幸的是,他们再次超载了术语 "site map" 来描述它们。

这段历史的后果之一是 ASP.NET 没有对 XML 站点地图 的内置支持,这听起来像是你在尝试根据您的问题进行制作。这主要是因为自 ASP.NET 2.0 以来,Microsoft 的实现没有(太多)改变,并且它是在该规范实现之前编写的。因此,使用 Microsoft 的 ASP.NET 导航系统对生成 XML 站点地图没有任何好处。

SEO 注意事项

但是请注意,所有 3 项对于 SEO 都很重要。

  1. 用户站点地图有助于搜索引擎索引,因为它提供内部站点 links 到需要索引的主要区域。
  2. 菜单和面包屑路径对于 link 您的所有内容页面彼此很重要,这有助于确定网站不同部分之间的相关性。
  3. XML 站点地图向搜索引擎提供直接 URL 信息,有助于减少网站上的搜索引擎流量,并帮助确保搜索引擎不会出现重要 URL 故障考虑索引。

因此您可能希望将所有这些都考虑在内,尽管严格来说所有这些都是可选的。

SEO 是关于首先提供好的内容,然后执行所需的步骤以便访问内容。以上每一项都应被视为 SEO 的进步,如果您真的关心搜索引擎排名,您应该尽一切可能,包括所有这 3 个步骤。

XML站点地图推荐

实际上,XML sitemap specification 对于 50,000 页以下的小型网站来说非常简单。所以一般不用费多少功夫就可以把它们放在一起。您可能要考虑自己这样做。

大多数开源实现的可扩展性都不是很好,因为它们都是一次性将整个数据集加载到内存中以生成 XML 而不是流式传输。此外,它们中的大多数并没有真正说明这样一个事实,即您可能在多个表中拥有动态数据,这些数据都对网站的 URL 有贡献。他们通常会由您来提供寻呼。大多数现有实现也不提供 Google.

提供的 specialized content types

我最近创建了 an implementation that does all of these things. It has not officially been released, and it is currently part of the MvcSiteMapProvider 项目。我们计划将 XML 站点地图功能分离到一个不同的程序集(和单独的 NuGet 包)中,这样它就可以在不引用 MVC 的情况下使用,但现在 MVC 是必需的(当然除非你想获取所有相关的类型并自己将它们编译成一个单独的 DLL)。一个包含 MVC 的 ASP.NET 项目仍然 运行 没问题,所以对于大多数项目来说这不是什么大问题。

此时没有任何文档,但我创建了一个 quick post 展示如何在 MVC 中连接它,包括一个演示应用程序。

对于 ASP.NET,您可以使用 MVC 实现(如果您安装了 MvcSiteMapProvider,它无论如何都会将 MVC 安装到您的项目中),或者您可以只使用 ASP.NET 页面。

在第二种情况下,配置看起来类似,但有一些例外。

  1. 您不需要使用 XmlSitemapFeedRouteRegistrar class。
  2. 您(当然)不需要使用控制器,您可以将其替换为 ASP.NET 页面,如下所示:

XmlSitemap.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 站点地图提要,主要是为了遵守这些特殊类型的规范。

  1. 默认 - /XmlSitemap.aspx - 可用于任何搜索引擎的站点地图。根据 XML sitemap specification.
  2. ,此 URL 需要在您的 robots.txt 文件中
  3. Google - /XmlSitemap.aspx?feedName=google - 此站点地图包含来自 Default 的相同 URL,但它还包含图像和视频专门内容。由于编码不正确的爬虫在遇到任何 Google 的特殊类型时可能会崩溃,因此我将它们分离到不同的提要中。您需要通过他们的网站管理员工具手动将此 URL 提交给 Google。
  4. 新闻 - /XmlSitemap.aspx?feedName=news - 这是用于 Google 的新闻站点地图功能,需要提交 per their specifications
  5. 移动 - /XmlSitemap.aspx?feedname=mobile - 这是针对 Google 的移动站点地图功能,需要提交 per their specifications

请注意,也可以在 ASP.NET 中使用路由来使这些 URL 更好。您只需要确保名称模板的指定方式与路由生成 URL 的方式相同,将 {feedName}{page} 的占位符放在 URL。

请注意,根据 XML 站点地图规范,XML 站点地图不能包含其虚拟目录之上目录的任何 URL。因此,最好确保您的路由不包含任何 / 字符(这意味着它适用于整个站点,而不是子目录)。