SEO 项目的主要作用是生成 sitemap.xml 文件。关于 sitemap.xml 文件,其最早由 Google 提出,后续受到 微软、雅虎等多个其他公司的联合支持。
本文档翻译自:https://www.sitemaps.org/zh_CN/
下面描述 Sitemap 协议的 XML 架构。
Sitemap 协议格式由 XML 标记组成。站点地图中的所有数据值必须是实体转义的。文件本身必须是 UTF-8 编码的。
sitemap 必须是:
- 以 标记开始,以 标记结束。
- 在 标记中指定命名空间(协议标准)。
- 每个 URL 对应一个条目,作为父级 XML 标记。
- 每个条目必须包含一条 子级条目。
除此之外,其他标签都是可选的。对可选标签的支持因搜索引擎而异。
并且,sitemap中所有的url必须是从属于同一个主机地址的,例如 www.example.com
或者 store.example.com
。查看文件定位章节,了解更多信息。
一个简单的sitemap.xml示例
下面的示例包含了所有的必须标签和可选标签。其中的lastmod、changefreq、priority都是可选标签。
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
这里还有包含多个url的示例。
XML 标签定义
标签 | 是否必须 | 描述 |
---|---|---|
<urlset> | required | 封装文件并引用当前的协议标准。 |
<url> | required | 每个URL实体的父级标签。下面的标签都是该标签的子级标签。 |
<loc> | required | 页面的URL。如果您的 Web 服务器需要,URL 必须以协议开头(例如 http)并且以尾部斜杠结束。标签的值必须小于 2,048 个字符。 |
<lastmod> | optional | 页面的最后一次修改时间。日期要符合 W3C Datetime 的格式标准。该格式允许省略时间部分,只使用YYYY-MM-DD。注意,这个日期是页面最后一次修改的时间,而不是 sitemap 生成的时间。还要注意,该标记与服务器可以返回的If-Modify-Since(304)头是分开的,并且搜索引擎可能会以不同的方式使用来自这两个源的信息。 |
<changefreq> | optional | 页面内容的更新频率。该值是为搜索引擎提供常规信息,可能与搜索引擎爬网页面的频率不完全相关。有效的值有: - always - hourly - daily - weekly - monthly - yearly - never always 用来表示文档每次被访问都会发生改变。never 用来表示文档已归档。 需要注意的是 changefreq 标签仅仅是一种提示,而不是指令。搜索引擎的爬虫程序在抓取网页时,仅仅把该值作为一种参考。一个网页被标记为hourly时,爬虫可能要超过一小时才会爬取一次。反过来,一个网页被标记为yearly时,爬虫也可能不到一年就会爬取一次。爬虫也可能会定期爬取标记为 nerver 的网页,以防这些页面发生意外更改。 |
<priority> | optional | 此URL相对于您网站上其他URL的优先级。有效值范围为0.0到1.0。该值不会影响将您的页面与其他站点上的页面进行比较的方式,它只会让搜索引擎知道您认为哪些页面对爬行器最重要。 默认值为0.5。 请注意,您为页面分配的优先级不太可能影响URL在搜索引擎结果页面中的位置。搜索引擎在同一站点上的URL之间进行选择时可能会使用此信息,因此您可以使用此标记来增加搜索索引中出现最重要页面的可能性。 此外,请注意,为您站点上的所有URL分配高优先级不太可能对您有所帮助。由于优先级是相对的,因此它仅用于在您的站点上的URL之间进行选择。 |
关于 If-Modified-Since
If-Modified-Since 是一个条件式请求头部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 响应,而在 Last-Modified 首部中会带有上次修改时间。当与 If-None-Match 一同出现时,它(If-Modified-Since)会被忽略掉,除非服务器不支持 If-None-Match。
实体转义
sitemap 必须是 utf-8 编码,并且一下字符必须转义:
符号 | 转义代码 | |
---|---|---|
与号 | & | & |
单引号 | ’ | ' |
双引号 | " | " |
大于号 | > | > |
小于号 | < | < |
另外,所有的url(包括 sitemap 的 url)都必须进行 url 转义和编码。如果您正在使用任何类型的脚本、工具或日志文件来生成 URL(除了手动键入它们之外),这通常已经为您完成了。请检查以确保您的 URL 符合 URI 的 RFC-3986 标准、IRI 的 RFC-3987 标准和 XML 标准。
以下是使用非 ASCII 字符(ü)以及需要实体转义(&)的字符的 URL 示例:
http://www.example.com/ümlat.php&q=name
使用 ISO-8859-1 编码(用于在使用该编码的服务器上托管)和 URL 转义:
http://www.example.com/%FCmlat.php&q=name
使用 UTF-8 编码和 URL 转义:
http://www.example.com/%C3%BCmlat.php&q=name
使用实体转义:
http://www.example.com/%C3%BCmlat.php&q=name
示例
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.example.com/catalog?item=12&desc=vacation_hawaii</loc>
<changefreq>weekly</changefreq>
</url>
<url>
<loc>http://www.example.com/catalog?item=73&desc=vacation_new_zealand</loc>
<lastmod>2004-12-23</lastmod>
<changefreq>weekly</changefreq>
</url>
<url>
<loc>http://www.example.com/catalog?item=74&desc=vacation_newfoundland</loc>
<lastmod>2004-12-23T18:00:15+00:00</lastmod>
<priority>0.3</priority>
</url>
<url>
<loc>http://www.example.com/catalog?item=83&desc=vacation_usa</loc>
<lastmod>2004-11-23</lastmod>
</url>
</urlset>
sitemap 索引文件
一个 sitemap 文件不能超过 50000 条 URL,并且要确保压缩前的原始文件大小小于50MB。
如果超过大小,则必须使用索引文件进行分页或分组。
sitemap 索引文件必须符合以下条件:
- 以
<sitemapindex>
标签开头,以</sitemapindex>
结束 - 每个
<sitemap>
代表一个sitemap文件 - 每个
<sitemap>
文件对应一个<loc>
子标签
<lastmod>
标签可选,用于表示最后一次修改时间。
注意:sitemap 索引文件只能指定与索引文件在相同域名下的文件。索引文件也必须是 UTF-8 编码。
示例
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>http://www.example.com/sitemap1.xml.gz</loc>
<lastmod>2004-10-01T18:23:17+00:00</lastmod>
</sitemap>
<sitemap>
<loc>http://www.example.com/sitemap2.xml.gz</loc>
<lastmod>2005-01-01</lastmod>
</sitemap>
</sitemapindex>
注意:索引文件中的 URL 也必须进行实体转义。
索引文件标签定义
标签 | 是否必须 | 描述 |
---|---|---|
<sitemapindex> | required | 封装所有sitemap文件的信息 |
<sitemap> | required | 封装一个独立的sitemap信息 |
<loc> | required | sitemap 的位置信息,用URL表示,可以是一个sitemap、一个Atom文件、RSS文件或者一个文本文件。 |
<lastmod> | optional | 当前 sitemap 文件的最后一次修改时间。不对应于 sitemap 内任一页面的修改时间。值应该符合 W3C Datetime 的格式。 通过提供上次修改时间戳,您可以使搜索引擎爬虫程序仅检索索引中站点地图的子集,即爬虫程序只能检索自特定日期以来修改过的站点地图。这种增量站点地图获取机制允许在非常大的站点上快速发现新的URL。 |
其他站点地图格式
sitemap 协议使您能够向搜索引擎提供有关您的页面的详细信息,我们鼓励您使用它,因为您可以提供有关站点页面的额外信息,而不仅仅是 URL。除了 XML 协议之外,我们还支持 RSS 摘要和文本文件,但是它们能提供的信息相比 XML 来说更加局限。
订阅文件(Syndication feed)
你可以提供一个 RSS (Real Simple Syndication) 2.0、Atom 0.3 或者 Atom 1.0 的订阅源。
请注意,这种方法可能不会让搜索引擎知道您站点中的所有URL,因为订阅源可能只提供最近 URL 的信息,尽管搜索引擎仍然可以在其正常的爬行过程中通过跟踪摘要中的页面链接,并使用这些信息来查找您站点上的其他页面。但请确保摘要位于您希望搜索引擎抓取的最高级别目录中。搜索引擎按如下方式从摘要中提取信息:
<link>
字段 - 页面的 URL- 修改日期字段 (RSS 的
<pubDate>
字段、Atom 的<updated>
字段) - 每个 URL 的修改时间,可选的。
文本文件
也可以直接提供一个纯文本文件,一行一个url,这个文件必须遵守以下约定:
- 文本文件必须是一行一个URL,URL中不能内嵌新行
- 必须是完整的url,包括协议,如 http
- 每个文本文件最多包含 50,000 个URL,不能超过50MB。超过这个限制,可以拆分成多个文本文件
- 必须使用 UTF-8 编码
- 不能包含URL列表以外的信息了
- 不能包含页头或者页脚信息
- 可以使用gzip压缩文件以减少带宽
- 你可以自定义文本文件的文件名。要确保 URL 符合 RFC-3986 标准,IRI 的 RFC-3987 标准
- 你应该把文本文件放置在你希望搜索引擎爬取的最高层级目录,丙炔确保该文件没有包含比它层级更高的文件。
示例
http://www.example.com/catalog?item=1
http://www.example.com/catalog?item=11
sitemap 文件位置
站点地图放置的位置决定了它能够包含的页面范围。例如http://example.com/catalog/sitemap.xml
文件可以包含所有http://example.com/catelog/
开头的页面,但是不能包含http://example.com/images/
开头的页面。
如果你有权限变更http://example.org/path/sitemap.xml
,这也表明你有权限提供以http://example.org/path/
为前缀的页面的信息。
举个例子来说,http://example.com/catalog/sitemap.xml
文件可以包含:
http://example.com/catalog/show?item=23
http://example.com/catalog/show?item=233&user=3453
但不能包含:
http://example.com/image/show?item=23
http://example.com/image/show?item=233&user=3453
https://example.com/catalog/page1.php
注意:sitemap中列举的url必须都使用相同的协议(例如 http)和相同的主机名。所以,http://www.example.com/sitemap.xml
不能包含http://subdomain.example.com
。
不被认为有效的URL将被排除在进一步考虑之外。强烈建议您将站点地图放在Web服务器的根目录下。例如,如果您的Web服务器位于example.com,则您的站点地图索引文件将位于http://example.com/sitemap.xml
。在某些情况下,您可能需要为不同的路径制作不同的站点地图(例如,如果您组织中的安全权限划分了对不同目录的写访问权限)。
如果 sitemap 的文件路径中包含端口号,那么其中所有 url 也都必须包含端口号。
sitemap 与交叉提交
要从单个主机提交多个主机的站点地图,您需要“证明”要在站点地图中为其提交URL的主机的所有权。这里有一个例子。假设您想要提交 3 个主机的站点地图:
www.host1.com with Sitemap file sitemap-host1.xml
www.host2.com with Sitemap file sitemap-host2.xml
www.host3.com with Sitemap file sitemap-host3.xml
然后把上述三个站点地图文件放置在单一的域名下:www.sitemaphost.com
,sitemap 文件的 url 类似下面这样:
http://www.sitemaphost.com/sitemap-host1.xml
http://www.sitemaphost.com/sitemap-host2.xml
http://www.sitemaphost.com/sitemap-host3.xml
默认情况下,这将导致交叉提交错误。因为你试图通过托管在www.sitemaphost.com
上的站点地图提交www.host1.com
的URL(另外两个同理)。想要避免该错误,你需要证明你拥有www.host1.com
的所有权。你可以通过将www.host1.com
的robots.txt
文件修改为指向www.sitemaphost.com
来实现这一点。
在这个例子中,http://www.host1.com/robots.txt
需要包含Sitemap: http://www.sitemaphost.com/sitemap-host1.xml
。这可以证明你拥有www.host1.com
的编辑权限。
现在你可以提交位于www.sitemaphost.com
上的站点地图了。
当一个特定的主机robots.txt
,例如上面的http://www.host1.com/robots.txt
,指向另一个主机上的站点地图或者站点地图索引。就说明每个目标站点地图(http://www.sitemaphost.com/sitemap-host1.xml
)的所有URL都属于指向它的主机(以http://www.host1.com/
开头)。这是因为,如前所述,站点地图应该只包含来自单个主机的URL。
验证站点地图
以下两个 XML schema 定义了允许在 sitemap 文件中出现的元素和属性。
For Sitemaps: http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
For Sitemap index files: http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd
下面也列举了一些可以用来基于 schema 验证 xml 文件结构是否有误的工具:
http://www.w3.org/XML/Schema#Tools
http://www.xml.com/pub/a/2000/12/13/schematools.html
可以配合 sitemap 的 schema 验证 sitemap 文件的格式是否有误。所以你需要添加额外的 schema 信息:
<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
...
</url>
</urlset>
索引文件:
<?xml version='1.0' encoding='UTF-8'?>
<sitemapindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
...
</sitemap>
</sitemapindex>
扩展 sitemap 协议
你可以使用自己的命名空间来扩展 sitemap 协议。再根元素下指定 namespace:
<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:example="http://www.example.com/schemas/example_schema"> <!-- namespace extension -->
<url>
<example:example_tag>
...
</example:example_tag>
...
</url>
</urlset>
通知搜索引擎的爬虫程序
创建好 sitemap 文件后,你可以主动去通知搜索引擎。然后搜索引擎会反查你的 sitemap 文件。
通过搜索引擎的提交界面提交sitemap
要将您的网站地图直接提交给搜索引擎,使您能够接收状态信息和任何处理错误,请参阅每个搜索引擎的文档。
在 robots.txt 文件中指定 sitemap 路径
你可以在 robots.txt 文件中指定 sitemap 文件的路径。只需要将 sitemap 的完整路径 url 加入:
Sitemap: http://www.example.com/sitemap.xml
**该指令独立于用户代理行,因此您将其放在文件中的哪个位置并不重要。**如果您有一个站点地图索引文件,您可以只包含该文件的位置。您不需要列出索引文件中列出的每个单独的站点地图。
你可以为每个 robots.txt 文件指定多个站点地图文件:
Sitemap: http://www.example.com/sitemap-host1.xml
Sitemap: http://www.example.com/sitemap-host2.xml
通过 HTTP 请求提交站点地图
要使用 HTTP 请求提交您的站点地图(使用搜索引擎提供的 URL 替换 ) ,请向以下URL发出请求:
<searchengine_URL>/ping?sitemap=sitemap_url
例如,你的站点地图是http://www.example.com/sitemap.gz
,则 URL 是:
<searchengine_URL>/ping?sitemap=http://www.example.com/sitemap.gz
当然,/ping?sitemap=
之后的内容都需要 URL encode:
<searchengine_URL>/ping?sitemap=http%3A%2F%2Fwww.yoursite.com%2Fsitemap.gz
可以使用wget、cURL或者其他机制发出HTTP请求。成功请求将返回 200 响应码。如果收到其他响应码,则应该重新提交请求。200 仅代表搜索引擎已经收到 sitemap,不代表站点地图本身或者其中包含的 URL 有效。要做到这一点,一个简单的方法是通过定时任务定期生成和提交站点地图。
注意:如果你提交的是 sitemap 索引文件,则只提交索引文件即可。不用再提交其中包含的 sitemap 文件。
排除内容
sitemap 文件的作用是告诉搜索引擎哪些内容期望被收录。如果你希望告诉搜索引擎哪些内容不要被收录,请使用robots.txt
文件或者 robots meta 标签。详情可查阅 robotstxt.org。