今天给博客写个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以后忘了自己也好找到。