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

Gre*_*aue 3 c# sitemap asp.net webforms

我完成了我的网站,或者我是这么想的。我没有站点地图,奇迹般地我错过了站点地图的整个概念,甚至不知道这是一个东西。我想我要向我的 CS 老师大喊大叫。

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

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

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

Nig*_*888 5

站点地图类型

有 3 种不同类型的“站点地图”。

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

一个简短的历史

如果您查看历史记录,它会使解析这些信息变得不那么令人困惑。以上名单按时间顺序排列。“站点地图”是一个术语,最初用于提供链接到网站主要部分的用户页面。Microsoft 决定再次使用术语“站点地图”来指代他们的 ASP.NET 2.0 导航系统。几年后,主要的搜索引擎联手提供了一个 XML 规范来提供有关站点的 URL 信息,但不幸的是,他们再次使用了术语“站点地图”来描述它们。

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

搜索引擎优化注意事项

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

  1. 用户站点地图有助于搜索引擎索引,因为它提供指向需要索引的主要区域的内部站点链接。
  2. 菜单和面包屑路径对于将所有内容页面相互链接很重要,这有助于确定站点不同部分之间的相关性。
  3. XML 站点地图为搜索引擎提供直接 URL 信息,有助于减少站点上的搜索引擎流量,并有助于确保搜索引擎没有考虑编入索引的重要 URL。

因此,您可能需要考虑其中的每一个,尽管严格来说它们都是可选的。

SEO 是首先提供好的内容,然后执行所需的步骤,以便可以访问内容。以上每一步都应该被视为 SEO 的一个进步,如果你真的关心搜索引擎的位置,你应该做所有可能的事情,包括所有 3 个步骤。

XML 站点地图推荐

实际上,对于 50,000 页以下的小型站点,XML 站点地图规范非常简单。因此,将它们组合在一起通常不会花费太多精力。您可能需要考虑自己执行此操作。

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

我最近创建了一个可以完成所有这些事情的实现。它尚未正式发布,目前是MvcSiteMapProvider项目的一部分。我们计划将 XML 站点地图功能分离到不同的程序集(和单独的 NuGet 包)中,以便它可以在不引用 MVC 的情况下使用,但现在 MVC 是必需的(当然,除非您想要获取所有相关类型并编译它们)自己进入一个单独的DLL)。带有 MVC 的 ASP.NET 项目仍然可以正常运行,因此对于大多数项目来说这不是什么大问题。

目前没有任何文档,但我创建了一个快速帖子,展示了如何在 MVC 中连接它,包括一个演示应用程序。

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

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

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

站点地图.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="XmlSitemap.aspx.cs" Inherits="XmlSitemap" %>
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上述配置实际上创建了 4 个不同的 XML 站点地图提要,主要是为了遵守这些特殊类型的规范。

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

请注意,也可以在 ASP.NET 中使用路由来使这些 URL 更好。你只需要确保名称模板的URL由路线生成同样的方式上述规定,把占位符{feedName},并{page}在URL中的适当位置。

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