今天给博客写个sitemap给站长平台爬取使用。第一个就去神马站长平台提交sitemap,遇到问题了。

神马站长平台提示,只能提交后缀为xml文件。我博客里显示的是sitemap.html,虽然Content-type设置为application/xml; charset=UTF-8但是没什么卵用,提交看后缀抓取才看Content-type。

现在博客的url使用了urlManage进行美化。由urlManage统一去提供后缀了。那后缀修改只能改改urlManage。看下配置文件:

     'urlManager' => [
         'enablePrettyUrl' => true,
         'showScriptName' => false,
         'suffix' => '.html',
         'rules' => [
            '<action:\w+>' => '/index/<action>',
            '<action:\w+>-<id:\d+>' => '/post/<action>',
         ],
     ],

添加了suffix,直接改成xml也不妥。

解决方法大概就是去掉suffix,自己手动在rules里输入后缀,不过控制器和action多起来好像也很麻烦,因为每个都要写,最终还是觉得生成xml文件就行了。可能也就没办法实时显示出文章,不过博客我个人定位还是给朋友看看教程和自己拿来做做备忘用的,所以发文章后检查完了再推送百度熊掌号再生成sitemap也不麻烦。

流程应该就这些,后面应该也不会再加其他的什么了。

然后后台生成那就需要加载前台config文件才行,然后使用url助手来生成前台规则的url,方便修改了会跟随一起生效。

Controller这块

public function actionCreateSitemap()
{
   // 加载前台配置
   $config = require Yii::getAlias('@frontend/config/main.php');
   $urlManege = new UrlManager($config['components']['urlManager']);
   $urlManege->baseUrl = Yii::$app->params['setting']['frontend_domain'];
   Url::$urlManager = $urlManege;
   
   //取出数据
   $models = Articles::find()->where(['status' => 1])->orderBy(['id' => SORT_DESC])->limit(50000)->all();
   if ($models === null) {
      Yii::$app->session->setFlash('warning', '没用找到文章数据!');
      return $this->redirect(Yii::$app->request->referrer);
   }
   $content = $this->renderPartial('sitemap', ['models' => $models]);
   
   //保存到前台web根目录下sitemap.xml作为文件名
   $file = Yii::getAlias('@frontend/web');
   $status = file_put_contents($file . '/sitemap.xml', $content);
   if ($status !== false) {
      Yii::$app->session->setFlash('success', '保存成功!路径是:' . $file . '/sitemap.xml');
   } else {
      Yii::$app->session->setFlash('error', '保存失败!路径是:' . $file . '/sitemap.xml');
   }
   
   return $this->redirect(Yii::$app->request->referrer);
}

还有一些问题,就是sitemap.xml这个没办法去扩展多个最多只能有5万个链接,神马站长平台只给10000,如果文章以外的页面需要生成sitemap也没办法加进来。

不够都不是什么麻烦事,以后需要了再搞好了,现在感觉可以用很久了。

然后是view页面

<?php

/* @var $models \backend\modules\blog\models\Articles[] */
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <?php foreach ($models as $model) : ?>
      <?= $model->generateSitemap() ?>
      <?php unset($model) ?>
   <?php endforeach; ?>
</urlset>

这个generateSitemap在model里,可以很方便的生成。

public function generateSitemap()
{
   $url = Url::to(['/post/view', 'id' => $this->id]);
   $xml = "<url>\n";
   $xml .= "<loc>{$url}</loc>";
   if ($this->created_at !== $this->updated_at) {
      $last = date('Y-m-d', $this->created_at);
      $xml .= "<lastmod>{$last}</lastmod>";
   }
   
   $xml .= "<changefreq>weekly</changefreq>";
   $xml .= "<priority>0.6</priority>" . PHP_EOL;
   $xml .= "</url>" . PHP_EOL;
   
   return $xml;
}

大概就这样!好了。。给这个笔记打个标签sitemap以后忘了自己也好找到。