設discuz已啟用偽靜態功能,使用5.0/5.5 GBK 版本;
1、meta,content 優化
2、內容頁的網頁復制問題
3、robots.txt使用及其它
更新
discuz5.5的robots.txt問題
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" />
<meta name="description" content="$seodescription" />
這里的$seokeywords、$seodescription就是后臺設置的那個值,下面說怎么定制這個值;{$metakeywords}是奇虎的關鍵字,留下以后處理
2.內容頁(viewthread)設置keywords為帖子標題,description為內容前100字
2.1修改 viewthread.php 文件:
在 include template('viewthread'); (更新:dz5.5為iinclude template($iscircle ? 'supesite_viewthread' : 'viewthread'); ) 語句的上面加入一行:
require_once DISCUZ_ROOT.'./include/bmt.thread.inc.php';
2.2創建 include/bmt.thread.inc.php 文件,內容為
<?php
if(!defined('IN_DISCUZ')) { exit('Access Denied'); }
$seokeywords = strip_tags($thread['subject']); //關鍵字設為帖子的標題
//(已更新: nethome 提出問題,當啟用主題分類并允許按類別瀏覽時,原來代碼會有問題。所以加了標簽過濾,本來在viewthread.php中改更好,為以后升級方便,還是放在這里吧,subject很短,不會影響效率)
$seodescription = current( $postlist );//description取文章內容的前100字
$seodescription = mb_substr( $seodescription['message'],0,100,"gb2312" );
$seodescription = htmlspecialchars( strip_tags($seodescription) );
?>
*此處數字和個別函數適用于GBK版本
最后一行作用是過濾內容中的html,否則在meta中會引起語法錯誤。先是去除HTML標簽,但因為這里是前100字,有可能html標簽已經被截斷了,所以又用了htmlspecialchars轉義一下,有可能會有些垃圾信息。
當然也可以在截取之前用strip_tags去除html標簽,可能效率會差了。
*所以此處表達式您需要根據自己的情況修改。
我目前用的是preg_replace( '/[^\xa1-\xff]/', '', $seodescription ),即過濾漢字以外的所在內容,但這樣會損失英文關鍵字。
別外說明,此處數據都是viewthread.php已取好的,所以不會產生額外的數據庫操作,只是做了字符串處理,不會引響效率。
3.列表頁(forumdisplay)設置不同的keywords和description
3.1修改 forumdisplay.php
文件,在 include template('forumdisplay'); 語句上面添加
require_once DISCUZ_ROOT.'./include/bmt.forum.inc.php';
3.2創建 include/bmt.forum.inc.php 文件,內容為
<?php
if(!defined('IN_DISCUZ')) { exit('Access Denied'); }
$seokeywords = $forum['name'];
$seodescription = $forum['description'];
switch ( $forum['fid'] ){
case 1: //此數字為版的ID號,不同版設置不同的meta
$seokeywords = 'key1,key2,...';
$seodescription = 'xxxx xxxx xxxx';
break;
case 2:
$seokeywords = 'key1,key2,...';
$seodescription = 'xxxx xxxx xxxx';
break;
}
?>
//更新:一般情況下可以不用switch和case,列表頁的關鍵字為版名,說明為版的說明,若要對某個版設置特殊的關鍵字和說明,可以設置 case。這樣解決了版面很多時要設置很多case語句,加快了程序執行速度(不了解php,JAVA的 case進行了優化,執行很快)
使用修改文件來實現,每版的meta改起來不方便,感覺有些弱智,呵呵。但沒有改數據庫,用了兩個單獨的文件,修改了兩個文件也很簡單,這樣升級或遷移更方便吧
case雖然多了一些,但比起讀數據庫的記錄,速度應該快很多
4.主頁meta
在后臺設置即可。(如果2、3不做,則meta也同主頁)
content的優化
discuz有個archiver,一是URL容易收錄,二是頁面比較干靜,還有description會從正文中取內容,但archiver沒有對內容中[b][url]之類的解析,那些標簽起不到作用,原樣顯示還會增加垃圾信息。
本部分主要做兩方面的優化,一是去除內容頁的無用信息,二是給標題加上
<h1>
。加上偽靜態和上篇meta的優化,效果就超過了archiver,因此可以在后臺禁用它,還減少了復制網頁。
實施方案
1.隱藏內容頁(viewthread)中的無用信息:
修改內容頁模板文件 templates/default/viewthread.htm:
用<!--{if $discuz_uid}--> <!--{/if}-->將要隱藏的信息包含起來。
準確的說是當游客(bots)訪問時,隱藏那些信息,當用戶登錄后是正常的,所以不影響使用。
這些信息主要指的是左側用戶信息欄、(資料 個人空間 主頁 短消息 等等)、用戶的簽名(隱藏后不怕簽名的內容影響正文,鏈接也不起作用了:P)
以住相關文章
2.為標題加上
<h1>
標簽
修改內容頁模板文件 templates/default/viewthread.htm:
將 <span class="bold">$post[subject]</span><br><br> 替換為
<h1>$post[subject]</h1>
定制“本帖最后由 XXX 于 xxxxxx 編輯”內容
修改文件 templates/default/misc.lang.php:將下面兩行改成您喜歡的內容:
'post_edit' => '\n\n[[i]] 本帖最后由 $editor 于 $edittime 編輯 [/i]]',
'post_edit_regexp' => '/\n{2}\[\[i\] 本帖最后由 .*? 于 .*? 編輯 \[\/i\]\]$/s',
比如我改成 [ 網站名 URL xxx 于 xxxx 編輯]。改程序無聊時的自娛,呵呵
注意上下兩個表達式要匹配。為了防止解析方括號是全角,不要復制后在文件中查找。
二、內容頁的網頁復制問題
看看內容頁的URL大家就知道了:thread-(tid)-(page)-(forumdisplay page).html,可以看出最后一節表示的是此帖在列表頁的第幾頁。所以,當您的帖子越來越多,這個帖就會由第一頁到第二頁...,它的URL就會不 斷的變化。其實打開一個列表頁就可以看出來,第2頁的帖子鏈接的最后數字都是2,第3頁的都是3,只是很少注意它。我是在SE的收錄中發現復制網頁越來越 多,才對最后的數字注意的。
解決方法
修改 forumdisplay.php 文件:
將 $extra = rawurlencode("page=$page$forumdisplayadd"); 語句替換為
$extra = rawurlencode("page=1$forumdisplayadd");
語句中的page就是forumdisplay page,這樣改后不管帖子在列表頁的第幾頁,這個數都是1。
功能損失:當用戶編輯帖子或版主管理帖子后,有個提示跳轉頁:選擇轉入列表頁還是主題頁,這時轉入列表頁的話,只能轉到列表頁第一頁,而不管您原來停留在第幾頁。
redirect的301重定向
在discuz論壇中可以看到類似redirect.php?tid=xxx&goto=lastpost#lastpost這樣的鏈接, 它的功能是實現“最新發表、最后發表、上一主題、下一主題“功能,僅這一個功能就可以給同一個內容頁造成四份復制網頁,因此將這樣的鏈接301永久重定向 到帖子的靜態地址。
解決方法
修改 redirect.php 文件:
將前兩個 require_once DISCUZ_ROOT.'./viewthread.php'; 語句替換為
$bmt_url='Location:/thread-'.$tid.'-'.$page.'-1.html';
header('HTTP/1.1 301 Moved Permanently');
header( $bmt_url );
將后兩個 require_once DISCUZ_ROOT.'./viewthread.php'; 語句替換為
$bmt_url='Location:/thread-'.$tid.'-1-1.html';
header('HTTP/1.1 301 Moved Permanently');
header( $bmt_url );
dz5.5的引用處也有個跳轉,也可以做301:
將 dheader("Location: viewthread.php?tid=$post[tid]&page=$page#pid$pid");替換為
$bmt_url='Location:/thread-'.$post[tid].'-'.$page.'-1.html#pid'.$pid;
header('HTTP/1.1 301 Moved Permanently');
header( $bmt_url );
***注意此處直接轉到了靜態地址,沒有做判斷是否開啟偽靜態功能,所以不開啟會有問題
功能損失:轉向到靜態地址后,動態地址中類似#lastpost的錨點將無法起作用了,可能要手動滾屏了
???好像沒有影響錨點
提示信息頁的網頁復制
這個問題和內容頁也有著很大的關系,呵呵。如管理員設置允許游客瀏覽列表,而禁止瀏覽內容時,這些內容頁都將返回一沒有權限的提示信息頁,但它們的 URL 是不同的,這樣就形成了嚴重的網頁復制,此外還有其它形成的無權操作等。別一種提示信息如帖子不存在等,數量大了也會形成網頁復制。這兩種提示信息,都是 通過showmessage函數分別調用nopermission.htm和showmessage.htm兩個模板實現的。
解決方法
1.創建另一個頭模板文件 templates/default/header_disbots.htm
內容同 header.htm 文件,但加入meta robot標簽,如下
<meta name="robots" content="noindex,nofollow" />
2.分別修改 templates/default/nopermission.htm 和 templates/default/showmessage.htm 文件
將它們第一行的 {template header} 替換為 {template header_disbots}
雖然對meta robots標簽支持的不是很廣泛,但這是比較省事的方法
因為是提示信息頁,用301來實現的話,還要傳給轉到的頁好多信息,修改起來比較麻煩
三、robots.txt使用
User-agent: *
#禁止一個版面的收錄
#如果有個水版,不想禁止游客權限,也不想SE收錄,已免影響網站質量,可以用如下方法
Disallow: /forum-1-
#數字即為要禁止版塊的ID。
#注意數字最后的 - 不要省略,否則連ID為11,12等1開頭的版都禁了
[更新]補充方法:再給內容頁加meta robot禁止
#再禁網頁復制
Disallow: /viewthread.php
#這個是內容頁的動態形式,前面對偽靜態做了優化并修改了很多的復制網頁,因此這里動態形式如打印頁等一定要禁止
Disallow: /forumdisplay.php
#這個要慎重:列表頁的動態形式,還包括精華、活動、投票等形式。我發現5.0的靜態化不徹底,它的上一頁下一頁翻頁仍是動態,這樣如果禁止了,十頁之后的內容就不能通這索引了。所以如果您站內的交差鏈接不豐富的話,不要在此禁止,以免影響收錄。
hekaiyu說沒有這個問題,去官方看了下5.5的確沒問題(也許我的5.0本來沒問題,也許官方在新版本中完善了正則表達式的替換規則),這樣更好了,禁止它,又干凈了好多
#禁止其它無用內容
Disallow: /profile
#用戶信息,不知為什么discuz也靜態化了,一律禁止
Disallow: /relatethread
Disallow: /post
Disallow: /blog
Disallow: /member
Disallow: /misc
Disallow: /faq
Disallow: /my
Disallow: /pm
Disallow: /digest
Disallow: /status
# ... ... 等等
# ----- robots.txt end ------
[更新]dz5.5的robots.txt后部分給出的Disallow: post.php等是不合規范的,一定要在前面加上"/"。>>詳細說明
首頁URL問題
后臺基本設置->首頁文件名如果不設置,會默認為index.php。所以站內到首頁的鏈接為形式為http: //domain/index.php。而我們一般引用論壇首頁或交換鏈接的形式一般是http://domain/。實際是一樣的,但SE可認為是兩個 URL,而且一個擁有很多的內部鏈接,一個擁有較多的外部鏈接,所以哪個被降級都不是好事情,最好統一起來。這里的修改目標是http: //domain/的形式。
1.進入后臺,基本設置->首面文件名 設置為: /
2.修改文件 member.php 將 header("Location: {$boardurl}".$indexname); 替換為
if( $indexname=='/'){
header("Location: {$boardurl}");
}else{
header("Location: {$boardurl}".$indexname);
}