sitemap

Sitemap 是一种用于帮助搜索引擎发现和索引网站内容的文件。它提供了一种结构化的方式,列出网站的所有页面及其相关信息,如更新时间、优先级和变化频率。通过 Sitemap,搜索引擎可以更高效地抓取网站内容,确保所有重要页面都被索引。

1、sitemap XML 介绍

Sitemap 是一种用于帮助搜索引擎发现和索引网站内容的文件。它提供了一种结构化的方式,列出网站的所有页面及其相关信息,如更新时间、优先级和变化频率。通过 Sitemap,搜索引擎可以更高效地抓取网站内容,确保所有重要页面都被索引。

Sitemap 的类型

  1. XML Sitemap:

    • 最常见的 Sitemap 格式。它使用 XML 格式来列出网站的 URL,并包含每个 URL 的元数据(如上次修改日期、变化频率和优先级)。
  2. HTML Sitemap:

    • 面向用户的 Sitemap,通常作为网站上的一个页面,列出所有主要页面的链接,帮助用户更方便地导航。
  3. RSS/Atom Feeds:

    • 通常用于博客或新闻网站,通过 RSS 或 Atom feeds 提供最新内容的更新。
  4. 视频和图片 Sitemap:

    • 专门用于包含视频或图片内容的网站,帮助搜索引擎更好地理解这些多媒体内容。

一个标准的 sitemap XML 文件包含一个根元素 <urlset>,以及多个 <url> 子元素。每个 <url> 元素描述一个单独的 URL,并包含以下子元素:

<loc>: URL 位置

<lastmod>: 上次修改时间

<changefreq>: 变化频率

<priority>: 优先级

以下是一个标准的 sitemap XML 文件示例:

<?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>2024-05-31</lastmod>
      <changefreq>daily</changefreq>
      <priority>1.0</priority>
   </url>
   <url>
      <loc>http://www.example.com/about</loc>
      <lastmod>2024-05-31</lastmod>
      <changefreq>monthly</changefreq>
      <priority>0.8</priority>
   </url>
</urlset>
  • <urlset>: 根元素,包含所有 URL 元素。需要包含 xmlns 属性,指定 sitemap 规范的 XML 命名空间。
  • <url>: 每个 URL 的容器,包含描述该 URL 的子元素。
  • <loc>: 必须的子元素,指定 URL 的完整地址。
  • <lastmod>: 可选的子元素,指定 URL 上次修改的日期。格式为 YYYY-MM-DD
  • <changefreq>: 可选的子元素,指定 URL 可能发生变化的频率。可能的值包括:always, hourly, daily, weekly, monthly, yearly, never
  • <priority>: 可选的子元素,指定 URL 的优先级,范围为 0.01.01.0 表示最高优先级。

2、创建 Sitemap 控制器

确保你的控制器 Sitemap.php 如下所示:

<?php
namespace app\index\controller;

use think\Controller;
use think\Db;

class Sitemap extends Controller
{
    public function index()
    {
        // 获取数据,例如从数据库中获取文章列表
        // $articles = Db::name('article')->field('id, title, update_time')->select();
        $articles = [
            [
                'id' => 1,
                'title' => 'First Article',
                'update_time' => '2024-05-31 12:00:00'
            ],
            [
                'id' => 2,
                'title' => 'Second Article',
                'update_time' => '2024-05-31 13:00:00'
            ],
            [
                'id' => 3,
                'title' => 'Third Article',
                'update_time' => '2024-05-31 14:00:00'
            ]
        ];
        // 生成 XML 内容
        $xmlContent = $this->generateSitemapXml($articles);

        // 返回 XML 响应:使用 response() 方法返回 XML 响应,并设置正确的 Content-Type 头。
        return response($xmlContent, 200, ['Content-Type' => 'application/xml']);
    }

    private function generateSitemapXml($articles)
    {
        $xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><urlset></urlset>');
        $xml->addAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');

        foreach ($articles as $article) {
            $url = $xml->addChild('url');
            $url->addChild('loc', url('index/article/detail', ['id' => $article['id']], true, true));
            $url->addChild('lastmod', date('Y-m-d', strtotime($article['update_time'])));
            $url->addChild('changefreq', 'weekly');
            $url->addChild('priority', '0.8');
        }

        return $xml->asXML();
    }
}

3、路由配置

需要配置路由,使得 sitemap.xml 能够正确指向新创建的控制器方法。在 application/route.php 文件中添加路由配置:

<?php
Copy code
use think\Route;

Route::get('sitemap.xml', 'index/Sitemap/index');
Licensed under 京ICP备17003353号-3