找回密码
 加入怎通
查看: 3177|回复: 8

[站长八卦] Discuz论坛的SEO优化方案

[复制链接]
TONY 发表于 2012-01-07 19:28:06 | 显示全部楼层 |阅读模式
设discuz已启用伪静态功能,使用5.0/5.5 GBK 版本;   
/ C9 x  A3 B' H  X1、meta,content 优化 ( E2 F4 r0 ?3 y3 l8 I
2、内容页的网页复制问题 * Z" Q, c, o* I# o9 _! b) [9 t
3、robots.txt使用及其它   更新
- @9 K# j3 c; V' D0 e$ k3 jdiscuz5.5的robots.txt问题
; `2 ~9 Y6 r2 D+ ~  BDZ 禁止一个版面帖子的收录的补充   一、meta的优化   discuz的后台可以对meta信息进行设置,甚至可以添加自己的头部信息,但它的设置都是针对于所有页面的,全部页面都拥有相同的keywords和description是SEO所不赞成的。   方案一:删除meta   修改页头模板文件 templates/default/header.htm:将meta的keywords和description标签删除。   这两个标签作用很小了,而且还有discuz自带的一些无用信息,用得不好反而会有坏作用,因此宁缺勿滥。   方案二:定制meta   本部分实现了将内容页keywords设为帖子标题,description为内容前100字;也实现了主页与各版列表页meta的单独设置(不同版的不同,同一版各列表页相同)。   1.修改页头模板文件 templates\default\header.htm:将meta的keywords和description标签改为如下形式   meta name=keywords content={$metakeywords}$seokeywords / 2 k1 t, Y" X& q, t7 t, P
meta name=description content=$seodescription /   这里的$seokeywords、$seodescription就是后台设置的那个值,下面说怎么定制这个值;{$metakeywords}是奇虎的关键字,留下以后处理   2.内容页(viewthread)设置keywords为帖子标题,description为内容前100字   2.1修改 viewthread.php 文件: & Y; c! D' P! ]3 P
在 include template('viewthread'); (更新:dz5.5为iinclude template($iscircle ? 'supesite_viewthread' : 'viewthread'); ) 语句的上面加入一行:
" P- m  ]' K9 S8 ~/ }2 Qrequire_once DISCUZ_ROOT.'./include/bmt.thread.inc.php';   2.2创建 include/bmt.thread.inc.php 文件,内容为   ?php 4 n0 H" m# }0 D) t0 f4 _' v$ T$ l
if(!defined('IN_DISCUZ')) { exit('Access Denied'); }   $seokeywords = strip_tags($thread['subject']); //关键字设为帖子的标题
* d" e2 \. q* `$ G; x& `, H- P//(已更新: nethome 提出问题,当启用主题分类并允许按类别浏览时,原来代码会有问题。所以加了标签过滤,本来在viewthread.php中改更好,为以后升级方便,还是放在这里吧,subject很短,不会影响效率)   $seodescription = current( $postlist );//description取文章内容的前100字 3 ^3 [0 a6 R: k, S0 I* i
$seodescription = mb_substr( $seodescription['message'],0,100,gb2312 );
: }9 m2 }9 I; N% r$ c) W3 s/ J) u$seodescription = htmlspecialchars( strip_tags($seodescription) );
8 b' E, y  b  a, j* O?   *此处数字和个别函数适用于GBK版本   最后一行作用是过滤内容中的html,否则在meta中会引起语法错误。先是去除HTML标签,但因为这里是前100字,有可能html标签已经被截断了,所以又用了htmlspecialchars转义一下,有可能会有些垃圾信息。 + B! d5 [4 u) o$ I2 w7 z
当然也可以在截取之前用strip_tags去除html标签,可能效率会差了。   *所以此处表达式您需要根据自己的情况修改。 ' U# [2 s. U2 O0 H- c+ P- S
我目前用的是preg_replace( '/[^\xa1-\xff]/', '', $seodescription ),即过滤汉字以外的所在内容,但这样会损失英文关键字。   别外说明,此处数据都是viewthread.php已取好的,所以不会产生额外的数据库操作,只是做了字符串处理,不会引响效率。   3.列表页(forumdisplay)设置不同的keywords和description   3.1修改 forumdisplay.php   文件,在 include template('forumdisplay'); 语句上面添加 + U6 w6 [9 c6 b# f; a. _9 S0 ~
require_once DISCUZ_ROOT.'./include/bmt.forum.inc.php';   3.2创建 include/bmt.forum.inc.php 文件,内容为   ?php
: `8 `, d' C9 r: u# a( u" K. Jif(!defined('IN_DISCUZ')) { exit('Access Denied'); }
8 v2 |  N- A- v& H& B1 G6 B2 T$seokeywords = $forum['name']; + S. F5 B8 U. a% n
$seodescription = $forum['description'];   switch ( $forum['fid'] ){ % t; O6 s6 M! \1 j3 G7 u+ b6 a2 b* k
case 1: //此数字为版的ID号,不同版设置不同的meta * ]  _1 }3 {% z8 H$ f( h, [, {  q2 R
$seokeywords = 'key1,key2,...'; ' d3 a' \: U2 Y9 S. M) n. |) ?9 W7 ^% j
$seodescription = 'xxxx xxxx xxxx'; 0 c" j7 o: C1 f4 c% z) V. W, T
break; 6 ?: C) n0 @1 d  v+ z
case 2:
+ X! b; m* |/ @+ R$seokeywords = 'key1,key2,...'; 2 Q; B2 O* {& B4 q' k
$seodescription = 'xxxx xxxx xxxx';
. ?  \3 u- V+ P( w7 N0 K: Lbreak;   }
/ q4 e( v4 M# Q/ z  Y+ V?   //更新:一般情况下可以不用switch和case,列表页的关键字为版名,说明为版的说明,若要对某个版设置特殊的关键字和说明,可以设置case。这样解决了版面很多时要设置很多case语句,加快了程序执行速度(不了解php,JAVA的 case进行了优化,执行很快)   使用修改文件来实现,每版的meta改起来不方便,感觉有些弱智,呵呵。但没有改数据库,用了两个单独的文件,修改了两个文件也很简单,这样升级或迁移更方便吧   case虽然多了一些,但比起读数据库的记录,速度应该快很多   4.主页meta
% |% O" H2 S: |/ ?( u7 m. y; F在后台设置即可。(如果2、3不做,则meta也同主页)   content的优化 " V9 Y3 |. D0 T& O, u0 J9 X
discuz有个archiver,一是URL容易收录,二是页面比较干静,还有description会从正文中取内容,但archiver没有对内容中[b][url]之类的解析,那些标签起不到作用,原样显示还会增加垃圾信息。
0 O% W8 |5 I+ w0 \- Z; I本部分主要做两方面的优化,一是去除内容页的无用信息,二是给标题加上 ) }! W. A+ E% P  P
h1
$ ~1 W% ^3 c) N" p4 d。加上伪静态和上篇meta的优化,效果就超过了archiver,因此可以在后台禁用它,还减少了复制网页。   实施方案   1.隐藏内容页(viewthread)中的无用信息:
4 J# `) T. l1 ?% [$ Z修改内容页模板文件 templates/default/viewthread.htm:   用!--{if $discuz_uid}-- !--{/if}--将要隐藏的信息包含起来。   准确的说是当游客(bots)访问时,隐藏那些信息,当用户登录后是正常的,所以不影响使用。
2 ^5 c( E4 d& m  Z1 I8 i这些信息主要指的是左侧用户信息栏、(资料 个人空间 主页 短消息 等等)、用户的签名(隐藏后不怕签名的内容影响正文,链接也不起作用了)
2 ~8 v- Y6 X+ [- y# l以住相关文章   2.为标题加上
: X0 z2 C8 S7 h* Z  ~h1 & j$ t( X2 G% G. k% m$ i8 |
标签 ' I; a6 w, t9 h$ n2 G  E
修改内容页模板文件 templates/default/viewthread.htm:   将 span class=bold$post[subject]/spanbrbr 替换为
* \) T% R0 X6 B  ?" {2 V2 z1 yh1$post[subject]/h1   定制本帖最后由 XXX 于 xxxxxx 编辑内容   修改文件 templates/default/misc.lang.php:将下面两行改成您喜欢的内容:   'post_edit' = '\n\n[] 本帖最后由 $editor 于 $edittime 编辑 ]',
& P" K, V/ {/ u( e# N9 o'post_edit_regexp' = '/\n{2}\[\[i\] 本帖最后由 .*? 于 .*? 编辑 \[\/i\]\]$/s',   比如我改成 [ 网站名 URL xxx 于 xxxx 编辑]。改程序无聊时的自娱,呵呵 . \  K) I! Q. E& h" Y: Z
注意上下两个表达式要匹配。为了防止解析方括号是全角,不要复制后在文件中查找。   二、内容页的网页复制问题   看看内容页的URL大家就知道了:thread-(tid)-(page)-(forumdisplay page).html,可以看出最后一节表示的是此帖在列表页的第几页。所以,当您的帖子越来越多,这个帖就会由第一页到第二页...,它的URL就会不断的变化。其实打开一个列表页就可以看出来,第2页的帖子链接的最后数字都是2,第3页的都是3,只是很少注意它。我是在SE的收录中发现复制网页越来越多,才对最后的数字注意的。   解决方法 ' g1 V* J" [0 w  d: F
修改 forumdisplay.php 文件:   将 $extra = rawurlencode(page=$page$forumdisplayadd); 语句替换为
- S5 ~4 ?: i# J. X$extra = rawurlencode(page=1$forumdisplayadd);   语句中的page就是forumdisplay page,这样改后不管帖子在列表页的第几页,这个数都是1。   功能损失:当用户编辑帖子或版主管理帖子后,有个提示跳转页:选择转入列表页还是主题页,这时转入列表页的话,只能转到列表页第一页,而不管您原来停留在第几页。   redirect的301重定向   在discuz论坛中可以看到类似redirect.php?tid=xxxgoto=lastpost#lastpost这样的链接,它的功能是实现最新发表、最后发表、上一主题、下一主题功能,仅这一个功能就可以给同一个内容页造成四份复制网页,因此将这样的链接301永久重定向到帖子的静态地址。   解决方法
5 A; o% Z9 f! w- t, V+ b修改 redirect.php 文件:   将前两个 require_once DISCUZ_ROOT.'./viewthread.php'; 语句替换为   ?. K1 }- k9 W  r7 [( J* `
$bmt_url='Location:/thread-'.$tid.'-'.$page.'-1.html';
0 i% I4 ^7 F6 `1 |9 F, l# k# d( xheader('HTTP/1.1 301 Moved Permanently'); 6 ], k0 R/ g) R0 n* g2 ^. s; q
header( $bmt_url ); 1 e5 x# o* z$ {+ n
将后两个 require_once DISCUZ_ROOT.'./viewthread.php'; 语句替换为
- [- G. b9 |' W/ }: m" X$ |; i/ f$bmt_url='Location:/thread-'.$tid.'-1-1.html';
2 g+ D/ `  z0 d+ d, V+ xheader('HTTP/1.1 301 Moved Permanently'); ! \& G0 b8 ~; F2 O) }
header( $bmt_url );   dz5.5的引用处也有个跳转,也可以做301:   将 dheader(Location: viewthread.php?tid=$post[tid]page=$page#pid$pid);替换为
& H' f+ k# c3 {: B6 {3 [: Y- W$bmt_url='Location:/thread-'.$post[tid].'-'.$page.'-1.html#pid'.$pid;
7 n6 }% u, G% A, T" v! oheader('HTTP/1.1 301 Moved Permanently'); 0 }. C7 n) D8 d" G! W, e0 A
header( $bmt_url );   ***注意此处直接转到了静态地址,没有做判断是否开启伪静态功能,所以不开启会有问题   功能损失:转向到静态地址后,动态地址中类似#lastpost的锚点将无法起作用了,可能要手动滚屏了
: Q3 g! }/ n; \- ^* s& T???好像没有影响锚点   提示信息页的网页复制   这个问题和内容页也有着很大的关系,呵呵。如管理员设置允许游客浏览列表,而禁止浏览内容时,这些内容页都将返回一没有权限的提示信息页,但它们的URL 是不同的,这样就形成了严重的网页复制,此外还有其它形成的无权操作等。别一种提示信息如帖子不存在等,数量大了也会形成网页复制。这两种提示信息,都是通过showmessage函数分别调用nopermission.htm和showmessage.htm两个模板实现的。   解决方法
2 |. k7 d+ Z9 G1.创建另一个头模板文件 templates/default/header_disbots.htm
5 y; r# }5 Y, [4 g内容同 header.htm 文件,但加入meta robot标签,如下   meta name=robots content=noindex,nofollow /   2.分别修改 templates/default/nopermission.htm 和 templates/default/showmessage.htm 文件 , t) C1 x3 q+ O6 w8 B
将它们第一行的 {template header} 替换为 {template header_disbots}   虽然对meta robots标签支持的不是很广泛,但这是比较省事的方法 , h0 u' T5 c4 Q9 L3 ^9 A
因为是提示信息页,用301来实现的话,还要传给转到的页好多信息,修改起来比较麻烦   三、robots.txt使用   User-agent: *   #禁止一个版面的收录
6 b( v* n' y( Z" R; a1 i, @#如果有个水版,不想禁止游客权限,也不想SE收录,已免影响网站质量,可以用如下方法 8 I$ i" q7 D2 B
Disallow: /forum-1-   #数字即为要禁止版块的ID。 0 c5 j4 A1 ~' e% ~  s
#注意数字最后的 - 不要省略,否则连ID为11,12等1开头的版都禁了
+ t1 f5 g' {& z7 k/ S[更新]补充方法:再给内容页加meta robot禁止   #再禁网页复制
( P& Y+ c) S$ l- Y1 cDisallow: /viewthread.php
- s8 V' @, K1 M- p#这个是内容页的动态形式,前面对伪静态做了优化并修改了很多的复制网页,因此这里动态形式如打印页等一定要禁止   Disallow: /forumdisplay.php
" i2 I, h9 i# o# z* F" ?#这个要慎重:列表页的动态形式,还包括精华、活动、投票等形式。我发现5.0的静态化不彻底,它的上一页下一页翻页仍是动态,这样如果禁止了,十页之后的内容就不能通这索引了。所以如果您站内的交差链接不丰富的话,不要在此禁止,以免影响收录。   hekaiyu说没有这个问题,去官方看了下5.5的确没问题(也许我的5.0本来没问题,也许官方在新版本中完善了正则表达式的替换规则),这样更好了,禁止它,又干净了好多   #禁止其它无用内容
) j) q, h; T6 t! ^5 \+ }Disallow: /profile
" y  h0 l( ?+ ~#用户信息,不知为什么discuz也静态化了,一律禁止
& L  i1 o3 k. x2 f4 }3 e% ?" pDisallow: /relatethread
. \. u+ D( u5 C) ^Disallow: /post 4 `: b  g- D8 R' r. B; F
Disallow: /blog
/ F0 _; @4 J2 W/ |; W5 N2 g" q; f! |Disallow: /member # `& q' A9 N1 R: B: B
Disallow: /misc ' x. D0 {6 P( A+ f9 M
Disallow: /faq
# c1 [8 h7 X* z3 J/ ADisallow: /my 1 u" f$ ~) X- S
Disallow: /pm
- {" A: w. d% k- v# g6 ^( @Disallow: /digest * j4 H3 x5 k" ^) a2 d" o) u! G
Disallow: /status
$ e: L1 g* T1 f/ i+ R1 \1 n+ h* ~) _3 Y# ... ... 等等 3 O  T# J& V* L/ }; o0 e
# ----- robots.txt end ------ 7 l2 L" J  @! p
[更新]dz5.5的robots.txt后部分给出的Disallow: post.php等是不合规范的,一定要在前面加上/。详细说明   首页URL问题   后台基本设置-首页文件名如果不设置,会默认为index.php。所以站内到首页的链接为形式为http: //domain/index.php。而我们一般引用论坛首页或交换链接的形式一般是http://domain/。实际是一样的,但SE可认为是两个 URL,而且一个拥有很多的内部链接,一个拥有较多的外部链接,所以哪个被降级都不是好事情,最好统一起来。这里的修改目标是http: //domain/的形式。   1.进入后台,基本设置-首面文件名 设置为: / $ W( ]- ?( x3 b
2.修改文件 member.php 将 header(Location: {$boardurl}.$indexname); 替换为   if( $indexname=='/'){ 0 R% o+ L$ r/ u& x& s  ^8 E
header(Location: {$boardurl}); " h% L7 z$ q- G- q
}else{
  D$ Q0 p; b  H# t( c" ?  d' Eheader(Location: {$boardurl}.$indexname); 4 q9 t6 ^3 X# R- t2 l" O
}   [更新]dz5.5为dheader   此修改处的功能是清除cookies后返回到首页,如不修改域名后就有两个/。暂时未发现使用/当首页文件名的其它问题   结 束   除了文件的修改,有些地方要配合后台设置,前面都提到了,这里总结一下。主要有:1.URL静态化,只启用普通页面静态化就可以了;2.不要启用 Archiver功能;3.后台的keywords和description设置只是针对首页的(如果您没做列表页和内容页的meta修改则也应用到它们);4.后台首页文件名为/(当然您也可以设置自己特定的)

暂时无法加载帖子列表

回复

使用道具 举报

西万路小混混 发表于 2026-02-24 22:29:45 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复

使用道具 举报

zhang900827 发表于 2026-03-16 00:13:43 | 显示全部楼层
这个分享太实用了,刚好能用到,感谢楼主!
回复

使用道具 举报

快乐的放牛娃 发表于 2026-05-05 23:41:50 | 显示全部楼层
刚好遇到类似问题,看完这个帖子心里有底了
回复

使用道具 举报

流云飞舞 发表于 2026-07-14 06:06:33 | 显示全部楼层
说得很实在,没有夸大其词,这种真实分享太难得了
回复

使用道具 举报

niejuxin 发表于 2026-07-14 06:45:20 | 显示全部楼层
蹲了这么久,终于看到有价值的讨论,支持一下!
回复

使用道具 举报

记忆开始 发表于 2026-07-27 15:17:19 | 显示全部楼层
完全赞同,我也是这么认为的,英雄所见略同~
回复

使用道具 举报

嗄鞋底 发表于 2026-08-28 20:56:27 | 显示全部楼层
楼主太厉害了,整理得这么详细,必须支持
回复

使用道具 举报

ptntk2010 发表于 2026-09-07 12:39:38 | 显示全部楼层
内容很干货,没有多余的废话,值得反复看
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-9-11 01:23 , Processed in 0.042939 second(s), 28 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表