|
|
设discuz已启用伪静态功能,使用5.0/5.5 GBK 版本;
! B( X1 |3 B8 v" r1、meta,content 优化 6 |; A& {5 [5 F, U
2、内容页的网页复制问题 ) x+ Y4 f: J, Q. T1 b
3、robots.txt使用及其它 更新 o, ~& |6 g6 G' l5 N3 C- {! }
discuz5.5的robots.txt问题 - Z7 B1 C2 |6 G5 C/ ~
DZ 禁止一个版面帖子的收录的补充 一、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 /
" a1 t8 K& @' lmeta name=description content=$seodescription / 这里的$seokeywords、$seodescription就是后台设置的那个值,下面说怎么定制这个值;{$metakeywords}是奇虎的关键字,留下以后处理 2.内容页(viewthread)设置keywords为帖子标题,description为内容前100字 2.1修改 viewthread.php 文件:
% S! u1 C2 s' O4 P& O5 }, i在 include template('viewthread'); (更新:dz5.5为iinclude template($iscircle ? 'supesite_viewthread' : 'viewthread'); ) 语句的上面加入一行:
4 b8 G9 M' [3 o. q5 frequire_once DISCUZ_ROOT.'./include/bmt.thread.inc.php'; 2.2创建 include/bmt.thread.inc.php 文件,内容为 ?php $ ~% ^0 o- x( D8 q* \7 g
if(!defined('IN_DISCUZ')) { exit('Access Denied'); } $seokeywords = strip_tags($thread['subject']); //关键字设为帖子的标题
/ `0 F; i0 N* A( r& b8 E. g. J//(已更新: nethome 提出问题,当启用主题分类并允许按类别浏览时,原来代码会有问题。所以加了标签过滤,本来在viewthread.php中改更好,为以后升级方便,还是放在这里吧,subject很短,不会影响效率) $seodescription = current( $postlist );//description取文章内容的前100字
& h* b+ `# X1 z) s$ C0 r/ L* B$seodescription = mb_substr( $seodescription['message'],0,100,gb2312 ); ( L: u! C3 f% @- L6 e
$seodescription = htmlspecialchars( strip_tags($seodescription) ); 8 U+ m! E& l3 s3 V" r7 @( o
? *此处数字和个别函数适用于GBK版本 最后一行作用是过滤内容中的html,否则在meta中会引起语法错误。先是去除HTML标签,但因为这里是前100字,有可能html标签已经被截断了,所以又用了htmlspecialchars转义一下,有可能会有些垃圾信息。
- z7 j$ Q5 F* u) y, P4 C当然也可以在截取之前用strip_tags去除html标签,可能效率会差了。 *所以此处表达式您需要根据自己的情况修改。
6 K- u% ]- L8 a7 x/ Y8 P我目前用的是preg_replace( '/[^\xa1-\xff]/', '', $seodescription ),即过滤汉字以外的所在内容,但这样会损失英文关键字。 别外说明,此处数据都是viewthread.php已取好的,所以不会产生额外的数据库操作,只是做了字符串处理,不会引响效率。 3.列表页(forumdisplay)设置不同的keywords和description 3.1修改 forumdisplay.php 文件,在 include template('forumdisplay'); 语句上面添加
- G/ }9 k2 ]5 q' a* p+ l/ lrequire_once DISCUZ_ROOT.'./include/bmt.forum.inc.php'; 3.2创建 include/bmt.forum.inc.php 文件,内容为 ?php . u1 n2 t6 r; H$ @, a! C' z
if(!defined('IN_DISCUZ')) { exit('Access Denied'); } ( i( ^7 a5 Y2 ~. u( |8 [
$seokeywords = $forum['name']; - E+ e% E" c! H) u* a+ H
$seodescription = $forum['description']; switch ( $forum['fid'] ){
6 m/ p4 B1 @% d3 p' P' Q( Scase 1: //此数字为版的ID号,不同版设置不同的meta ) O0 K" F3 J1 o9 L; l3 d* v
$seokeywords = 'key1,key2,...'; 1 I$ b& x! t$ u; Q
$seodescription = 'xxxx xxxx xxxx';
' b; U' ^! I8 R2 ubreak;
+ W7 H; u/ B; C- dcase 2: 9 N4 b$ P7 O ^: T
$seokeywords = 'key1,key2,...'; 3 Q1 o2 s0 o3 l/ V7 R3 C
$seodescription = 'xxxx xxxx xxxx';
! S+ Z8 V9 n+ V' ~; c1 J0 Tbreak; }
5 b# F9 U% U/ |5 L. A0 s, k2 k? //更新:一般情况下可以不用switch和case,列表页的关键字为版名,说明为版的说明,若要对某个版设置特殊的关键字和说明,可以设置case。这样解决了版面很多时要设置很多case语句,加快了程序执行速度(不了解php,JAVA的 case进行了优化,执行很快) 使用修改文件来实现,每版的meta改起来不方便,感觉有些弱智,呵呵。但没有改数据库,用了两个单独的文件,修改了两个文件也很简单,这样升级或迁移更方便吧 case虽然多了一些,但比起读数据库的记录,速度应该快很多 4.主页meta ! X5 V, c2 y( B
在后台设置即可。(如果2、3不做,则meta也同主页) content的优化 0 h8 X; T2 W8 o" C6 ^+ V5 q3 x
discuz有个archiver,一是URL容易收录,二是页面比较干静,还有description会从正文中取内容,但archiver没有对内容中[b][url]之类的解析,那些标签起不到作用,原样显示还会增加垃圾信息。 7 j; e$ L. m9 x9 K8 ^, N9 b
本部分主要做两方面的优化,一是去除内容页的无用信息,二是给标题加上 ( M, G$ K: a" |8 |7 K# L
h1
6 X8 \8 k+ p' ]。加上伪静态和上篇meta的优化,效果就超过了archiver,因此可以在后台禁用它,还减少了复制网页。 实施方案 1.隐藏内容页(viewthread)中的无用信息:
2 X6 w9 G7 T2 k# U修改内容页模板文件 templates/default/viewthread.htm: 用!--{if $discuz_uid}-- !--{/if}--将要隐藏的信息包含起来。 准确的说是当游客(bots)访问时,隐藏那些信息,当用户登录后是正常的,所以不影响使用。
% a/ c& j" f# I& J% h这些信息主要指的是左侧用户信息栏、(资料 个人空间 主页 短消息 等等)、用户的签名(隐藏后不怕签名的内容影响正文,链接也不起作用了 )
3 W: w: E) n4 F" l* [8 e以住相关文章 2.为标题加上
. F5 C( P1 h0 Z% d2 t" @8 Z) H* Ch1
8 v T2 N8 z: ]3 w/ p) e标签
" C3 N) e# h6 S. E2 b( n修改内容页模板文件 templates/default/viewthread.htm: 将 span class=bold$post[subject]/spanbrbr 替换为 3 r$ j8 { S% \% a5 t% X& C
h1$post[subject]/h1 定制本帖最后由 XXX 于 xxxxxx 编辑内容 修改文件 templates/default/misc.lang.php:将下面两行改成您喜欢的内容: 'post_edit' = '\n\n[] 本帖最后由 $editor 于 $edittime 编辑 ]', ; O$ Q* j( _5 }$ A, |- J
'post_edit_regexp' = '/\n{2}\[\[i\] 本帖最后由 .*? 于 .*? 编辑 \[\/i\]\]$/s', 比如我改成 [ 网站名 URL xxx 于 xxxx 编辑]。改程序无聊时的自娱,呵呵
) }7 _8 V% T1 ]2 B注意上下两个表达式要匹配。为了防止解析方括号是全角,不要复制后在文件中查找。 二、内容页的网页复制问题 看看内容页的URL大家就知道了:thread-(tid)-(page)-(forumdisplay page).html,可以看出最后一节表示的是此帖在列表页的第几页。所以,当您的帖子越来越多,这个帖就会由第一页到第二页...,它的URL就会不断的变化。其实打开一个列表页就可以看出来,第2页的帖子链接的最后数字都是2,第3页的都是3,只是很少注意它。我是在SE的收录中发现复制网页越来越多,才对最后的数字注意的。 解决方法
; x. N2 ~+ y7 _# L: U7 L, y修改 forumdisplay.php 文件: 将 $extra = rawurlencode(page=$page$forumdisplayadd); 语句替换为
, J, c) W4 F( ^6 t: G4 T) w% S$extra = rawurlencode(page=1$forumdisplayadd); 语句中的page就是forumdisplay page,这样改后不管帖子在列表页的第几页,这个数都是1。 功能损失:当用户编辑帖子或版主管理帖子后,有个提示跳转页:选择转入列表页还是主题页,这时转入列表页的话,只能转到列表页第一页,而不管您原来停留在第几页。 redirect的301重定向 在discuz论坛中可以看到类似redirect.php?tid=xxxgoto=lastpost#lastpost这样的链接,它的功能是实现最新发表、最后发表、上一主题、下一主题功能,仅这一个功能就可以给同一个内容页造成四份复制网页,因此将这样的链接301永久重定向到帖子的静态地址。 解决方法
3 c% T( \( X3 [/ C/ y( }: y% t* P修改 redirect.php 文件: 将前两个 require_once DISCUZ_ROOT.'./viewthread.php'; 语句替换为
' b+ b4 k! ?, F; @5 K0 x, k$bmt_url='Location:/thread-'.$tid.'-'.$page.'-1.html';
4 ?. L. C, r. \0 E: Cheader('HTTP/1.1 301 Moved Permanently'); $ Q0 R S1 _" \3 f7 K6 t+ ]
header( $bmt_url ); ( O$ t/ `, U2 W
将后两个 require_once DISCUZ_ROOT.'./viewthread.php'; 语句替换为 ) x2 r) n2 d: G+ T/ Q8 J/ ~# S
$bmt_url='Location:/thread-'.$tid.'-1-1.html'; & u, P4 |$ e6 X5 U- G
header('HTTP/1.1 301 Moved Permanently');
, f( Z: |4 f, k. Cheader( $bmt_url ); dz5.5的引用处也有个跳转,也可以做301: 将 dheader(Location: viewthread.php?tid=$post[tid]page=$page#pid$pid);替换为
0 u1 E- x+ {: @3 j/ I5 L$bmt_url='Location:/thread-'.$post[tid].'-'.$page.'-1.html#pid'.$pid; 3 r8 |3 T7 R/ } }8 c, |8 o% N
header('HTTP/1.1 301 Moved Permanently'); / n. E2 }# }, \# f; u/ \, q) o
header( $bmt_url ); ***注意此处直接转到了静态地址,没有做判断是否开启伪静态功能,所以不开启会有问题 功能损失:转向到静态地址后,动态地址中类似#lastpost的锚点将无法起作用了,可能要手动滚屏了 2 M! b' G: T- J) V! D
???好像没有影响锚点 提示信息页的网页复制 这个问题和内容页也有着很大的关系,呵呵。如管理员设置允许游客浏览列表,而禁止浏览内容时,这些内容页都将返回一没有权限的提示信息页,但它们的URL 是不同的,这样就形成了严重的网页复制,此外还有其它形成的无权操作等。别一种提示信息如帖子不存在等,数量大了也会形成网页复制。这两种提示信息,都是通过showmessage函数分别调用nopermission.htm和showmessage.htm两个模板实现的。 解决方法 - Q5 m" ? t1 w( u( U6 U
1.创建另一个头模板文件 templates/default/header_disbots.htm / J. k2 @( I3 @( D: ~; m) @- l
内容同 header.htm 文件,但加入meta robot标签,如下 meta name=robots content=noindex,nofollow / 2.分别修改 templates/default/nopermission.htm 和 templates/default/showmessage.htm 文件 2 Y! R$ P$ S& X! h
将它们第一行的 {template header} 替换为 {template header_disbots} 虽然对meta robots标签支持的不是很广泛,但这是比较省事的方法 ' N* e X: Z9 H" g1 S0 e
因为是提示信息页,用301来实现的话,还要传给转到的页好多信息,修改起来比较麻烦 三、robots.txt使用 User-agent: * #禁止一个版面的收录
; A( |- ?$ i0 n7 d1 g' |% c, D#如果有个水版,不想禁止游客权限,也不想SE收录,已免影响网站质量,可以用如下方法 $ M1 i6 b7 q6 W/ x# Q8 w$ H
Disallow: /forum-1- #数字即为要禁止版块的ID。
2 |; N+ d) T# e' p8 s) w) j#注意数字最后的 - 不要省略,否则连ID为11,12等1开头的版都禁了 1 q% M) T3 ]* z0 ~8 S6 J
[更新]补充方法:再给内容页加meta robot禁止 #再禁网页复制 # p& q [3 r% p
Disallow: /viewthread.php
4 u- ]& @# |* p( Z1 R% @#这个是内容页的动态形式,前面对伪静态做了优化并修改了很多的复制网页,因此这里动态形式如打印页等一定要禁止 Disallow: /forumdisplay.php
- G& m. d" b; d! V# F0 _* v2 z) u# f#这个要慎重:列表页的动态形式,还包括精华、活动、投票等形式。我发现5.0的静态化不彻底,它的上一页下一页翻页仍是动态,这样如果禁止了,十页之后的内容就不能通这索引了。所以如果您站内的交差链接不丰富的话,不要在此禁止,以免影响收录。 hekaiyu说没有这个问题,去官方看了下5.5的确没问题(也许我的5.0本来没问题,也许官方在新版本中完善了正则表达式的替换规则),这样更好了,禁止它,又干净了好多 #禁止其它无用内容 $ X' o2 o" F4 ?' x: a
Disallow: /profile 1 V/ [7 G k, O$ N
#用户信息,不知为什么discuz也静态化了,一律禁止 " |# @4 G% o& o: Y) O8 P6 O% w0 X+ [
Disallow: /relatethread
- n9 S$ E# d5 \! |Disallow: /post
( c c* a& l8 aDisallow: /blog
7 a9 o) v- R' A' V% |4 W2 ^Disallow: /member - P. a! \+ b) e4 k& K% j
Disallow: /misc + {. s) ?* J# S* U, o* i
Disallow: /faq
5 @' d6 ^- N2 n fDisallow: /my 2 W5 y0 h" Y& \# R6 U
Disallow: /pm
1 P- r7 Z! w- M% X8 L* qDisallow: /digest
' U" S# d$ N" A% e# G2 E' sDisallow: /status / l9 Z" P. Q, ?: [0 M& s; f! W
# ... ... 等等 " b4 F/ @8 U* h9 o$ ?2 s- M. `
# ----- robots.txt end ------
& v/ z: R4 J; |" G2 C, p[更新]dz5.5的robots.txt后部分给出的Disallow: post.php等是不合规范的,一定要在前面加上/。详细说明 首页URL问题 后台基本设置-首页文件名如果不设置,会默认为index.php。所以站内到首页的链接为形式为http: //domain/index.php。而我们一般引用论坛首页或交换链接的形式一般是http://domain/。实际是一样的,但SE可认为是两个 URL,而且一个拥有很多的内部链接,一个拥有较多的外部链接,所以哪个被降级都不是好事情,最好统一起来。这里的修改目标是http: //domain/的形式。 1.进入后台,基本设置-首面文件名 设置为: /
# H) J3 t7 y1 u/ V5 r' d! F, `3 H2.修改文件 member.php 将 header(Location: {$boardurl}.$indexname); 替换为 if( $indexname=='/'){ 1 c$ z; I: l& r F( q, K8 {
header(Location: {$boardurl}); 7 j3 a) X2 m; L2 Y8 J( u
}else{
$ N& ]5 v6 f+ A7 H; V6 i o& i( cheader(Location: {$boardurl}.$indexname); 4 U' B7 u4 E1 A8 i* [! s1 ~) V
} [更新]dz5.5为dheader 此修改处的功能是清除cookies后返回到首页,如不修改域名后就有两个/。暂时未发现使用/当首页文件名的其它问题 结 束 除了文件的修改,有些地方要配合后台设置,前面都提到了,这里总结一下。主要有:1.URL静态化,只启用普通页面静态化就可以了;2.不要启用 Archiver功能;3.后台的keywords和description设置只是针对首页的(如果您没做列表页和内容页的meta修改则也应用到它们);4.后台首页文件名为/(当然您也可以设置自己特定的) |
|