Discuz X2论坛SEO指南

后台设置

全局 > SEO设置

  • URL静态化:URL规则。一旦设置不能轻易修改。
  • 门户:设置门户页面的title、keywords和description。
    • 这个是下一步的重点。
  • 论坛:设置论坛页面的title、keywords和description。
    • 这个是重点。
  • 家园:设置个人空间页面的title、keywords和description。
    • 目前不是重点。
  • 群组:设置群组页面的title、keywords和description。
    • 目前不是重点。
  • 其他:不清楚有什么用。

门户的SEO设置

  • 完成用户注册和激活的整理后,可以把论坛的列表页和内容页都单独生成门户页面,这样SEO就变得非常重要。
  • 可以为首页、列表页、内容页设置不同的title、keywords和description。
  • 可以为不同版块的列表页设置不同的title、keywords和description。

论坛的SEO设置

  • 可以为首页、列表页、内容页设置不同的title、keywords和description。
  • 可以为不同版块的列表页设置不同的title、keywords和description。

Discuz! X2 SEO存在的问题

主要问题是重复的Meta信息。

其次是URL静态化不完全。

注:这里的Meta信息指description和keywords。

重复的Meta信息

  1. 同一个版块的列表页,第一页、第二页、第三页…的Meta信息完全一样。(www.discuz.net也是这样)
  2. 一个帖子的第二页、第三页、第四页…的Meta信息完全一样,都是帖子的标题+网站标题。(www.discuz.net也是这样)

对策: 在description中加入页码(分页数{page})。

URL静态化不完全

  1. 一级版块的URL仍然是动态的。(www.discuz.net也是这样)
  2. “最后发表”的URL仍然是动态的。(www.discuz.net也是这样)

对策: 通过robots.txt屏蔽动态URL。

优化技巧

避免Archiver分散权重

例子:

从上面的例子我们可以看到,www.discuz.net有意把Archiver的URL改为动态的, 降低了Archiver页面的权重,减少了搜索引擎的收录, 最大程度避免了网站页面的权重因为Archiver而下降。

诀窍就在文件名前面的那一个小小的问号上,是不是很神奇?

为Archiver设置动态URL的方法

Discuz! X2后台 > 全局 > SEO设置 > URL静态化:

论坛Archiver页,格式由“{action}-{value}.html”改为“?{action}-{value}.html”。

为帖子设置标签和相关帖子

打开了标签和相关帖子后,和当前帖子标签相同的其他帖子会显示在当前帖子的下方。

这样做的好处是用户有可能点击相关帖子,从而增加PV,同时也有效增加了内链。

允许用户设置标签的方法

Discuz! X2后台 > 用户 > 用户组 > 选择某个用户组 > 基本设置:

允许使用标签,把“否”改为“是”。

自动生成标签

参考资料“X2优化分析三—自动标签!自动获取标签SEO优化”提供了一种自动生成标签的方法,需要简单修改Discuz! X2的源代码。

显示相关帖子的方法

Discuz! X2后台 > 界面 > 界面设置 > 帖子内容页:

相关帖子条目数,默认为10条。

参考资料

利用SpeedPHP的URL Rewrite功能实现网站结构调整后的301重定向

最近要把一个网站从VPS迁移到SAE上,由于SAE还不支持web2py,因此整个网站用SpeedPHP重写。

在更新网站的过程中,对部分URL进行了重新规划,以实现更短、更容易理解的URL,例如/introduction改为/intro,/application改为/contact。熟悉SEO的朋友都知道,废弃的URL直接返回404并不是最佳选择,通过301跳转到新页面或者首页上才是首选。通过SpeedPHP的URL Rewrite功能,我们可以很容易地实现网站结构调整后的301重定向。

SpeedPHP的URL Rewrite功能的使用方法可以参考我之前写的《在SpeedPHP中启用URL Rewrite》。

主要代码如下:

$ gvim index.php &
$spConfig = array(
‘ext’ => array(
‘spUrlRewrite’ => array(
‘map’ => array(
‘introduction’ => ‘main@redirect’,
‘application’ => ‘main@’redirect’,

$ gvim controller/main.php &
function redirect() {
header(‘HTTP/1.1 301 Moved Permanently’);
header(‘Location: /’);
}

这样就实现了废弃的URL到网站首页的301跳转,而不需要借助.htaccess。SpeedPHP还是很强大的。

在SpeedPHP中启用URL Rewrite

启用Apache的.htaccess
==========================

参考资料:Ubuntu下启动Apache对.htaccess文件的支持

$ sudo a2enmod
rewrite
$ gvim /etc/apache2/sites-enabled/000-default &
AllowOverride All
$ sudo service apache2 restart

SpeedPHP的.htaccess文件
============================

参考资料:Apache的UrlRewrite伪静态htaccess设置

$ cd /var/www/ # root of SpeedPHP project
$ gvim .htaccess &

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L]

在SpeedPHP中启用URL Rewrite
===============================

参考资料:SpeedPHP框架的urlrewrite伪静态实现

$ gvim index.php &
$spConfig = array(
‘launch’ => array(
‘router_prefilter’ => array(
array(‘spUrlRewrite’, ‘setReWrite’),
),
‘function_url’ => array(
array(‘spUrlRewrite’, ‘getReWrite’),
),
),
);

测试URL Rewrite的效果
=========================

$ gvim index.php &
$spConfig = array(
‘auto_display’ => TRUE,

$ gvim controller/main.php &
function test_smarty() {
$this->name = ‘chinakr’;
$this->display(‘index.html’);
}

$ gvim tpl/index.html &

Hi, {$name}!
Go to Home Page or stay here.

$ lynx localhost/index.php?c=main&a=test_smarty
$ lynx localhost/main-test_smarty.html

也即默认的URL Rewrite,得到的URL的形式是“controller-action.html”。

优化我们的URL
=================

参考资料:SpeedPHP框架的urlrewrite伪静态实现

看起来像HTML页面的形式
————————

$ gvim index.php &
$spConfig = array(
‘ext’ => array(
‘spUrlRewrite’ => array(
‘suffix’ => ”,
‘sep’ => ‘/’,
),
),

$ lynx localhost/index.php?c=main&a=test_smarty
$ lynx localhost/main/test_smarty.html

也就是说,现在的URL的形式是“controller/action.html”,目录层次和逻辑关系更加清晰。

更加简洁的形式
—————–

$ gvim index.php &
$spConfig = array(
‘ext’ => array(
‘spUrlRewrite’ => array(
‘suffix’ => NULL,
‘sep’ => ‘/’,
),
),

$ lynx localhost/index.php?c=main&a=test_smarty
$ lynx localhost/main/test_smarty

也就是说,现在的URL的形式是“controller/action”,更简洁了。

URL中的参数
===============

参考资料:SpeedPHP框架的urlrewrite伪静态实现

$ gvim tpl/index.html &

Sample for URL with arguments.

$ lynx localhost/index.php?c=main&a=test_smarty&id=0&from=baidu
$ lynx localhost/main/test_smarty/id/0/from/baidu.html

也就是说,现在的URL的形式是“controller/action/参数1/值1/参数2/值2”,不太美观。

优化我们的URL参数
====================

参考资料:SpeedPHP框架的urlrewrite伪静态实现

$ gvim index.php &
$spConfig = array(
‘ext’ => array(
‘spUrlRewrite’ => array(
‘suffix’ => NULL,
‘sep’ => ‘/’,
‘map’ => array(
‘smarty’ => ‘main@test_smarty’,
),
‘args’ => array(
‘smarty’ => array(‘id’, ‘from’),
),
),
),

$ lynx localhost/index.php?c=main&a=test_smarty&id=0&from=baidu
$ lynx localhost/smarty/0/baidu

也可以这样:

$ gvim index.php &
$spConfig = array(
‘ext’ => array(
‘spUrlRewrite’ => array(
‘suffix’ => NULL,
‘sep’ => ‘/’,
‘map’ => array(
‘smarty’ => ‘main@test_smarty’,
),
‘args’ => array(
‘smarty’ => array(‘from’, ‘baidu’),
),
),
),

$ lynx localhost/index.php?c=main&a=test_smarty&id=0&from=baidu
$ lynx localhost/smarty/baidu/0

在这里,建议把重要的参数放在前面,不重要的放在后面,这样逻辑相对更清晰一些。

能否做得更好?
=================

事实上,如果SpeedPHP的URL能够支持这样的形式可能逻辑关系会更清晰一些:
/controller/action-参数1-值1-参数2-值2.html
或者
/controller/action-值1-值2.html

这样的话,上面的URL就可以写成:
http://localhost/main/test_smarty-id-0-from-baidu.html
或者
http://localhost/main/test_smarty-0-baidu.html

这样是不是会更清楚更好看一些呢?见仁见智,权当抛砖引玉了!

HTML中base标签的使用

在公务员类网站中,考试大的SEO做得很出色。在考试大的首页源代码中发现了下面两行代码:
<base target=”_blank” />
<base href=”http://www.233.com/” />

通过Google“html base”,找到了下面两篇参考资料:

HTML base tag – W3Schools
http://www.w3schools.com/tags/tag_base.asp
HTML5 base Tag
http://www.w3schools.com/html5/tag_base.asp

在HTML4和HTML5中,base的用法是一样的。

用法举例:
<base href=”http://www.w3schools.com/images/” target=”_blank” />
href指定页面中所有相对链接的base URL。
target指定页面中所有超链接和表单默认的target,可选值包括_blank, _parent, _self, _top和framename。

也就是说,考试大的首页虽然保留了www.examda.com,但是页面中的所有相对链接都在www.233.com下打开。这样,虽然没有做全站的301跳转,但是流量同样可以从老域名逐步导向新域名。

web2py中自动生成带关键字标题的方法

在Controller文件中:
response.title = ‘海淀驾校’
response.keywords = ‘北京海淀驾校, 海驾’

在Model文件中:
<title>{{if len((response.title + ‘ | ‘ + response.keywords).decode(‘utf-8’)) <= 80:}}{{=response.title}} | {{=response.keywords}}{{else:}}{{=response.title}}{{pass}}</title>

页面的标题是:
海淀驾校 | 北京海淀驾校, 海驾

注:
如果“标题 | 关键字”这种形式的标题超过了80个字符,那么将会采用“标题”这种形式,以符合SEO规范。

实例:
海淀驾校