站点地图(Sitemap)文件,用于说明你的网站中有哪些资源(网页、视频、图片等)可被访问、这些资源的相关信息(更新时间、重定向、移动端适配等)、以及这些资源之间的相互关系。 站点地图文件支持多种格式,例如:XML
、RSS
、TXT
、HTML
等。举例的这四种格式目前Google都支持,Baidu只支持XML
和TXT
。
站点地图简单来说就是向搜索引擎提供了一份网站说明,用于提高SEO。但是如果你的网站规模较小(少于 100 个网页),且你的网页可以从首页开始通过一个或多个链接访问到,其实不需要额外配置站点地图文件,搜索引擎会比较好的搜索出你网站的结构。
本文只介绍XML
格式。为了简便,下文中用「sitemap
文件」指代「站点地图文件」。
简介
先放一个简单的示例:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.moneyslow.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
XML
格式的sitemap
文件,有以下三种必选标签:
- 文件由
<urlset>
包裹,且必须在<urlset>
中声明命名空间。 - 每个
URL
对应一个<url>
标签。 - 每个
<url>
中需包含一个<loc>
标签。
以上示例中,第一行为XML
文件声明,其余标签为站点地图的规范标签,定义在 http://www.sitemaps.org/schemas/sitemap/0.9
命名空间下。除了以上说明的三个必选标签外,其余标签都是可选标签。可选标签的支持情况依赖每个搜索引擎自身的实现,例如Google不支持changefreq
和<priority>
。
另外需额外注意的地方:
- 文件需使用
UTF-8
编码。 - 标签内容需进行实体转义,后续会详细介绍。
- 文件中所有
<loc>
指定的网址必须和sitemap
文件保持同一域名同一目录。例如都以www.moneyslow.com
开头或者都以sub.moneyslow.com
开头。后续会详细介绍。
标签元素定义
<urlset>
- 必选,作为根元素包裹文件以及声明命名空间。<url>
- 必选,对应代表网站中的一个资源。该标签是唯一的二级标签,其余标签都是该标签的子标签。<loc>
- 必选,指定访问的url,必须以协议名称开头(例如http)。且长度小于2,048个字符。<lastmod>
- 可选,指定该<url>
最后修改日期。采用W3C Datetime格式,一般使用YYYY-MM-DD
格式省略时间部分。
需注意,这个值和http header
中的If-Modified-Since (304)
是相互独立的,搜索引擎会根据自身的实现分别取对应的值。<changefreq>
- 可选,指定<url>
的大概更新频率。用于告诉搜索引擎大概多久重新抓取一次。
有效值有:always
、hourly
、daily
、weekly
、monthly
、yearly
、never
。awalys
代表每次访问该网址都返回不一样的内容。never
用于表示一个已归档的资源。
需注意的是,这里只是向搜索引擎告知网站资源的更新情况,而搜索引擎的实际抓取频率取决于搜索引擎自身的实现。另外Google不支持这个标签,Baidu支持。<priority>
- 可选,该<url>
在网站中的比重,取值0.0-1.0之间。默认值为0.5。需注意该比重只是相对于当前网站下。另外Google不支持该标签,Baidu支持。
实体转义
sitemap
文件必须使用UTF-8
格式保存。以及所有标签内容都需要对下列字符进行转义:
描述 | 字符 | 转义码 |
---|---|---|
&符号 | & | &amp; |
单引号 | ' | &apos; |
双引号 | " | &quot; |
大于号 | > | &gt; |
小于号 | < | &lt; |
除此之外,需确保<loc>
中的网址经过URL编码,以及符合RFC-3986(URI)规范、XML规范(对于IRIs
符合RFC-3987)。
下面是一个采用非ASCII
字符(ü)和需要进行实体转义的字符(&)的网址示例:
http://www.moneyslow.com/ümlat.html&q=name
经过编码和转义后的同一网址:
http://www.moneyslow.com/%C3%BCmlat.html&amp;q=name
站点地图文件示例
下面是一个包含多个<url>
以及不同可选标签的sitemap
文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.moneyslow.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.moneyslow.com/catalog?item=12&amp;desc=vacation_hawaii</loc>
<changefreq>weekly</changefreq>
</url>
<url>
<loc>http://www.moneyslow.com/catalog?item=73&amp;desc=vacation_new_zealand</loc>
<lastmod>2004-12-23</lastmod>
<changefreq>weekly</changefreq>
</url>
<url>
<loc>http://www.moneyslow.com/catalog?item=74&amp;desc=vacation_newfoundland</loc>
<lastmod>2004-12-23T18:00:15+00:00</lastmod>
<priority>0.3</priority>
</url>
<url>
<loc>http://www.moneyslow.com/catalog?item=83&amp;desc=vacation_usa</loc>
<lastmod>2004-11-23</lastmod>
</url>
</urlset>
站点地图索引文件(Sitemap index files)
每个sitemap
文件最多可包含50,000个<url>
,且文件大小最多50MB(Baidu是10M)。文件传输时一般会用gzip
等方式进行压缩,传输完成及解压后文件大小必须在50M(或10M)以内。
如果你的sitemap
文件过大,或者希望对站点地图进行分组,可以创建一个站点地图索引文件,然后在站点地图索引文件中引用sitemap
文件。同样的,站点地图索引文件中最多可引用50,000个sitemap
文件,文件大小最多50M(Baidu 10M),以及使用UTF-8
编码格式。
下面用「index
文件」替代「站点地图索引文件」。
index
文件包含以下标签:
<sitemapindex>
,必选,根元素,需声明命名空间<sitemap>
,必选,二级标签,用于代表一个sitemap
文件<loc>
,必选,指定sitemap
文件的网址。具有和sitemap
文件中<loc>
一样的编码规则和转义规则。<lastmod>
,可选,指定最后修改日期。
类似sitemap
文件,index
文件里的每个<sitemap>
都必须和index
文件保持同一域名和目录。
例如http://www.yoursite.com/sitemap_index.xml
中可包含http://www.yoursite.com
下的sitemap
文件,但是不能包含http://yourhost.yoursite.com
下的sitemap
文件。
站点地图索引文件示例
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>http://www.moneyslow.com/sitemap1.xml.gz</loc>
<lastmod>2004-10-01T18:23:17+00:00</lastmod>
</sitemap>
<sitemap>
<loc>http://www.moneyslow.com/sitemap2.xml.gz</loc>
<lastmod>2005-01-01</lastmod>
</sitemap>
</sitemapindex>
站点地图文件路径
sitemap
文件中的<url>
都必须和sitemap
文件在同一目录。例如,如果一个sitemap
文件位于http://moneyslow.com/catalog/sitemap.xml
,则该文件中可以包含以下资源:
http://moneyslow.com/catalog/show
http://moneyslow.com/catalog/item.html
但是不能包含以下资源:
http://moneyslow.com/image/show
https://moneyslow.com/catalog/page1.php
即,一个sitemap
文件中只能包含同协议、同域名、同目录下的资源。所以一般把sitemap
文件存放在网站的根目录下。对于不符合规范的链接,搜索引擎会忽略跳过。
跨域名
但是,有时候我们希望把所有sitemap
文件都保存在同一台主机下,例如:
sub1.host.com
的sitemap
文件存放在:http://sitemap.host.com/sub1.xml
sub2.host.com
的sitemap
文件存放在:http://sitemap.host.com/sub2.xml
在sub1.xml
文件中引用的都是sub1.host.com
下的资源。但是因为sub1.xml
位于sitemap.host.com
下,不符合前面介绍的规范,所以搜索引擎会忽略。如果我们主动向搜索引擎提交该sitemap
文件的话,搜索引擎还会返回错误。
此时,我们需要在http://sub1.host.com/robots.txt
中增加额外的配置,用于将sub1.host.com
下的sitemap
文件指向其他链接,如下:
User-agent: *
# 将该内容插入robots.txt任意一行即可
Sitemap: http://sitemap.host.com/sub1.xml
另外要注意,此时sub1.xml
虽然位于sitemap.host.com
,但其实代表的是sub1.host.com
的站点地图, 所以sub1.xml
文件中只能包含sub1.hsot.com
下的资源。
通知搜索引擎
一般通用的有以下三种方式:
- 在搜索引擎的相关后台设置
sitemap
文件地址,搜索引擎会定期检查。 - 类似上面介绍的跨域名情况,在
robots.txt
中显示声明sitemap
文件地址。搜索引擎在下次访问网站robots.txt
时候发现有sitemap
文件会进行收录。 - 搜索引擎会提供相关API接口,每次网站更新,就调用接口通知搜索引擎有更新。这个方式是相对最有效的。
另外还需注意一点,通过观察web服务器日志可以发现,即便搜索引擎请求了最新的sitemap
文件,在搜索引擎的搜索结果上可能还是没有显示出我们新增的页面或者修改后的页面。这里要明确一点,我们只是提供了一份网站说明,搜索引擎获取到这份说明后具体会怎么处理由搜索引擎自身决定的。
Baidu搜索
Baidu搜索引擎在以上规范的基础上,有一些修改:
- sitemap文件支持
GBK
格式 - 不支持
index
文件 - 新增
<mobile:mobile/>
标签,用于收录移动端搜索。 - 支持轻量级链接提交组件,将一段JS代码放置在站点每一个页面源代码中,当页面被访问时,页面链接会自动推送给百度。
mobile:mobile标签
Baidu的<mobile:mobile>
是对标准sitemap
协议的扩展,命名空间为:http://www.baidu.com/schemas/sitemap-mobile/1/
,有以下四种取值:
<mobile:mobile/>
:移动网页<mobile:mobile type="mobile"/>
:移动网页<mobile:mobile type="pc,mobile"/>
:自适应网页,代表页面会适配不同屏幕尺寸,但是网址不变。<mobile:mobile type="htmladapt"/>
:代码适配,服务端会返回不同的代码以适配不同的客户端环境,但是用户访问的网址不变
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">
<url>
<loc>http://m.moneyslow.com/index.html</loc>
<mobile:mobile type="mobile"/>
<lastmod>2024-08-07</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.moneyslow.com/index.html</loc>
<lastmod>2024-08-07</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.moneyslow.com/autoadapt.html</loc>
<mobile:mobile type="pc,mobile"/>
<lastmod>2024-08-07</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.moneyslow.com/htmladapt.html</loc>
<mobile:mobile type="htmladapt"/>
<lastmod>2024-08-07</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
</urlset>