thumbnail for this post
翁雨键
翁雨键
explore the unknown..
Dec 10, 2020 1 min read

Discuz! Q的搜索引擎优化(SEO)攻略

原文发布于小番麻友圈:https://mahjong.chat

Discuz! Q目前版本对搜索引擎的内容索引还不是很好,前后端分离的单页程序在没有针对搜索引擎优化时(可行的优化包括服务端渲染或静态化),搜索引擎目前只能抓取到一个默认的前端模版,所以你会看到你的页面被搜索引擎索引后显示的是 “## Build Setup” 这样的默认index前端模版上的description meta标签里内容。

为了让搜索引擎能覆盖更多的小番麻友圈的内容,从而给站点带来精准的搜索流量,我尝试对Discuz! Q做了一些搜索引擎优化(主要是内容索引覆盖方面),这里介绍一下。

我们先来看看做了优化后在各个搜索引擎索引的效果:

微软Bing搜索:

bing search result

Google搜索:

google search result

百度搜索:

baidu search result

原文首发于小番麻友圈

我们可以看到,在做了优化后,一方面搜索引擎可以更准确的描述每个页面的内容(标题,描述),另一方面网站可被索引的页面也大大增加了。目前优化刚刚上线几天,微软Bing搜索和Google的爬虫很快就爬到了大部分页面,而百度的爬虫更新则比较慢只更新了一部分(当然更新速度也跟站点的权重有关,更新:两周后索引有较大增加),但也可以看到首页的索引已经被更新为我们希望的标题和描述不再是## Build Setup了。

下面介绍一下优化的方法。由于Discuz! Q目前还没有开源,为了避免后续版本更新带来的合并代码的困难,我这次的优化没有直接在Discuz! Q上改,而是单独做成了一个discuzQ_seo_app。我把代码放在github上开源出来,如果你有同样的需求也可以使用:https://github.com/Jamesweng/discuzQ_seo_app

优化这块我的思路

这是一项针对搜索引擎的优化,并非面向终端用户的功能。代码方面能够尽量分离避免太大的耦合,可以减少后续两方面(面向搜索引擎/面向用户)的维护成本。所以在实现上我采用了API对接的方式。discuzQ_seo_app这个面向搜索引擎的程序,只依赖于Discuz! Q的列表/详情等几个数据API接口,自行后端渲染出适合搜索引擎阅读的页面。在顶层流量分发方面,从nginx里分出搜索引擎的流量(识别user-agent),将搜索引擎的流量导向discuzQ_seo_app,而正常的用户流量导向Discuz! Q服务。

discuzQ_seo_app的部署使用方法

discuzQ_seo_app也是一个基于laravel的应用,使用的laravel版本依赖于PHP 7.3或以上。部署使用有这几个步骤:

  1. 下载代码出来:git clone https://github.com/Jamesweng/discuzQ_seo_app.git
  2. 把代码目录下的.env.example文件改名为.env,并更新里面的配置为你的Discuz! Q站,其中DISCUZQ_URL为你的站点的访问地址,LOGO_URL为一个正方形的logo,APP_NAME为网站名字,META_DESCRIPTION为网站描述,META_KEYWORDS为网站关键词。
  3. 运行 "php artisan key:generate" 生成laravel的APP_KEY。
  4. 运行"nohup ./dev_start.sh &" 后台运行laravel的开发模式,成功后本地使用http://127.0.0.1:8000 可以访问到面向搜索引擎版本的Discuz! Q。(你也可以按照laravel的php配置,使用nginx+php-fpm来运行discuzQ_seo_app服务)
  5. 配置前端的nginx,根据user-agent,将搜索引擎的流量转发到discuzQ_seo_app服务。比如我的站点的配置如下,检测到是搜索引擎的user agent则返回8000端口的discuzQ_seo_app服务,否则返回81端口的Discuz! Q服务:
    1. location /sitemap.xml {
    2. try_files $uri $uri/;
    3. }
    4. location / {
    5. proxy_set_header Host $host;
    6. proxy_set_header X-Forwarded-For $remote_addr;
    7. if ($http_user_agent ~* "Baiduspider|Bytespider|JikeSpider|YisouSpider|Googlebot|spider|Spider|bingbot|Sitemaps") {
    8. proxy_pass http://127.0.0.1:8000$request_uri;
    9. break;
    10. }
    11. proxy_pass http://127.0.0.1:81$request_uri;
    12. }

     

其他方式运行

我在github上也放置了这个服务的Dockerfile,你可以使用docker_build.sh脚本来构建一个docker镜像,然后使用docker_start.sh脚本来启动服务。docker镜像中包含了服务运行需要的nginx+php-fpm依赖,对外以81端口服务。事实上我在线上也是采用的这种方式,discuzQ_seo_app和discuz! Q为两个独立的docker容器互不影响,前端由nginx转发流量。

让搜索引擎更快的索引

你可以制作sitemap.xml网站索引文件,并通过站长工具(比如Bing的站长管理工具,其他搜索引擎类似都有提供)提交给搜索引擎,使得搜索引擎更快的抓取你的页面。比如我的sitemap.xml文件:https://m.mahjong.chat/sitemap.xml 网上有很多sitemap文件的生成工具,比如:https://www.xml-sitemaps.com/ 。(后续版本discuzQ_seo_app也可以直接支持sitemap.xml生成)

你也可以通过在每个页面嵌入搜索引擎提供的js脚本的方式,在页面被用户访问时自动将页面推送给搜索引擎索引。将脚本放在Discuz! Q后台的"第三方统计"脚本里即可,脚本的获取可以在各家搜索引擎的站长管理后台中获取。

如果你在使用的过程中有什么问题或者有更好的想法,欢迎加我微信交流:6080901。

最后:欢迎与本站(小番麻友圈)交换友链哦。