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

2024-02-04

我的网站已经完成了,至少我是这么想的。我没有站点地图,奇迹般地我错过了站点地图的整个概念,甚至不知道它是一件事。我想我要向我的计算机老师大喊一声。

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

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

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


站点地图类型

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

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

一个简短的历史

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

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

搜索引擎优化考虑因素

但请注意all 3这些项目对于 SEO 很重要。

  1. 用户站点地图有助于搜索引擎索引,因为它提供了指向需要索引的主要区域的内部站点链接。
  2. 菜单和面包屑路径对于将所有内容页面相互链接起来非常重要,这有助于识别网站不同部分之间的相关性。
  3. 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 页面。

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

  1. 您不需要使用XmlSitemapFeedRouteRegistrar class.
  2. 您(当然)不需要使用控制器,您可以将其替换为 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 站点地图提要,主要是为了遵守这些专用类型的规范。

  1. 默认 -/XmlSitemap.aspx- 可与任何搜索引擎一起使用的站点地图。此 URL 需要位于您的robots.txt文件按照XML 站点地图规范 http://www.sitemaps.org/protocol.html#submit_robots.
  2. 谷歌 -/XmlSitemap.aspx?feedName=google- 此站点地图包含与默认值相同的 URL,但还包含图像和视频专门内容。由于编码不正确的爬虫如果遇到 Google 的任何专门类型可能会崩溃,因此我将它们分成了不同的提要。您需要通过 Google 的网站管理员工具手动将此 URL 提交给 Google。
  3. News - /XmlSitemap.aspx?feedName=news- 这是针对Google的新闻站点地图功能,需要提交根据他们的规格 https://support.google.com/news/publisher/answer/74288?hl=en.
  4. 移动的 -/XmlSitemap.aspx?feedname=mobile- 这是针对Google的移动站点地图功能,需要提交.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET 站点地图,有多重要? 的相关文章

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 当存在打开的 ASP.NET 4.5 Websocket 时,IIS 应用程序池无法回收

    我遇到了一个问题 可以通过以下方式复制 您需要 IIS8 因此必须在 Windows 8 或 Windows Server 2012 R2 上 在 IIS 管理器中创建一个新网站 例如在端口 8881 上的 TestWs 指向一个新文件夹
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 如何避免超出限制:开车?

    我有一个 gscript 抛出 超出限制 驱动器 当我单击按钮时 我有一个 50 行的列表 一些代码将迭代该列表并为每一行调用 gdscript 这个gd脚本 从模板生成文件 制作副本 在文件上插入一个表 将文件制作为 PDF 将文件移动到
  • OpenId Connect 中用户的唯一 ID 是什么

    我们有一个使用 Asp Net Identity 的 Asp Net 4 5 MVC 应用程序来管理我们的客户数据库 我们目前正在使用 Microsoft 帐户身份验证 我们正在考虑使用 OpenId Connect 以便拥有工作 学校帐户
  • Xvfb 多显示器并行处理?

    对运行多个 xvfb 显示器感到好奇 我有 10 50 个并行运行的脚本实例连接到 xvfb 显示器 运行相同数量的 xvfb 显示器并 1 对 1 连接是否有利 或者多个进程可以共享同一个显示吗 RAM 不是问题 处理能力也不是问题 一台
  • 自动化 GUI 测试 .NET CF (Windows Mobile 5)

    我的公司正在考虑在进行 alpha 测试之前对我们当前的应用程序使用自动化 GUI 测试 我们当前的主要重点是稳健性测试 我们想要实现这一目标的一种方法是可以在几个小时 几天内重复的自动化 UI 测试 对于我们的桌面版本 我们决定使用 Au
  • R & quosures - 如何获取作为函数参数传递的向量中包含的符号名称?

    我想写一个R函数arg2str返回作为参数输入的符号的名称 即字符串向量 对于最简单的情况 我只有一个输入符号 library rlang arg2str v0 lt function arg rlang quo name enquo ar
  • Redshift 查询:错误 xx000 磁盘已满 redshift

    我执行了以下查询 select employee name max employee dept as dept from employeeDB where employee name is not null and employee nam
  • C++ 参数包,仅限于具有单一类型的实例?

    从 C 11 开始 我们可以创建可以接受任何参数序列的模板函数 template
  • 当 Cassandra 不知道“cassandra”默认用户时,如何重置 Cassandra 超级用户?

    如何在不更改源代码的情况下重置默认 Cassandra 凭据 我已经检查过类似的问题如何重置丢失的 Cassandra 管理员用户密码 https stackoverflow com questions 18398987 how to re
  • Eclipse 崩溃并且无法重新启动。我不明白堆栈跟踪

    Eclipse 崩溃并且无法重新启动 有人可以帮助我了解问题所在吗 日志中的消息如下 我在 Win7 上并使用 Android SDK 进行开发并且我最近安装了 subclipse svn 非常感谢 ENTRY org eclipse co
  • 在更新面板中突出显示 gridview 行而不回发

    我在更新面板中有一个网格视图 其中包含以下代码来选择一行 这反过来又使用表单记录中的详细信息更新另一个更新面板 protected void gvMainGrid RowDataBound object sender GridViewRow
  • 如何使用测试客户端和 post 方法测试带有 ModelChoiceField 的 Django 表单

    如何使用 Django test client post 来测试具有 ModelChoiceField 的表单 传递给post方法的数据字典应该怎么写呢 我所做的方式根本不选择任何值 我有一个包含以下字段的表单 country forms
  • 在动画或 SlideUp/slideDown 中使用 stop() 时的 jQuery 高度

    我有一个带有隐藏子菜单的菜单 我正在制作子菜单的动画 当我将鼠标悬停在菜单项上时打开 并在鼠标移出时关闭 当用户将鼠标悬停在许多菜单项上时 所有动画都会排队 为了解决排队问题 我在动画之前添加了 stop 这导致了更严重的问题 子菜单的高度
  • 从文件而不是备份“挂载”PostgreSQL 数据库

    我接到一个从 PostgreSQL 数据库中提取数据的项目 我以前没有使用 PostgreSQL 的经验 但我的项目是修复现有代码的错误 因此连接到引擎并获取数据的所有逻辑都已经就位 我遇到的问题是数据库以直接来自源 HDD 的文件夹和文件
  • 如何删除actionscript中字符串的一部分?

    所以我的字符串类似于 BlaBlaBlaDDDaaa2aaa345 我想摆脱它的子字符串 BlaBlaBlaDDD 所以操作的结果将是一个字符串 aaa2aaa345 如何使用动作脚本执行这样的事情 我只想用字符串 替换 http live
  • 无法使用 pymssql 连接到 SQL Server 数据库,但可以使用底层 freetds tsql 连接

    我不知道为什么会收到此错误 并且找不到任何解决方案 我可以使用 freetds tsql 连接到 SQL Server 数据库 但在使用连接时不断收到错误pymssql connect 具体错误是 pymssql OperationalEr
  • 类型错误:无法读取未定义的属性“消息” - Twitter API

    以下是运行 app js 时的输出 当一切正常时 这种情况完全随机发生 绝对没有做任何改变 TypeError Cannot read property message of undefined at home ec2 user envir
  • 颤动键盘完成按钮导致文本字段内容消失

    我的表单中有 2 个文本字段 当我单击第二个文本字段中键盘上的 完成 按钮时 键盘会隐藏 两个文本字段都会变空 当我手动关闭键盘时也会发生同样的情况 然后文本字段的内容也会丢失 看起来每次发生这种情况屏幕都会刷新 为什么会这样呢 overr
  • Android - Matcher.find() 无限

    我已经实现了 AsyncTask 其中用户提供的正则表达式用于匹配巨大的 html 代码数据 然而 由于某些正则表达式包含大量量词 回溯 Matcher find 会变得无限 我尝试过使用可中断字符序列此处提供 当 Matcher find
  • Spring Boot 令牌认证

    我尝试为另一个应用程序登录 Spring Boot 应用程序并使用 Spring Security 生成令牌 我试图实现的目标 用户名和密码发送到 REST 控制器 如果用户名和密码正确 我想生成具有 30 分钟过期时间的令牌并将其发送回用
  • ASP.NET 站点地图,有多重要?

    我的网站已经完成了 至少我是这么想的 我没有站点地图 奇迹般地我错过了站点地图的整个概念 甚至不知道它是一件事 我想我要向我的计算机老师大喊一声 我一直在阅读它 动态生成站点地图似乎相当复杂 我必须这样做 因为我的页面基本上只是一个使用参数