作者:Trotter
信箱: [email protected]
來源: www.gbunix.com
轉載請保持文件完整,註明出處。
前言
隨著網路上的內容以驚人速度的增長也越來越突出了搜尋引擎的重要性,如果網站想更好地被搜尋引擎收錄,網站設計除了面向用戶友好(User Friendly)外,搜尋引擎友好(Search Engine Friendly)的設計也是非常重要的。進入搜尋引擎的頁面內容越多,則被使用者用不同的關鍵字找到的幾率越大。不得不承認,將動態網頁連結rewriting成靜態連結是最保險且穩定的搜尋引擎優化方式。此方案是針對phpBB論壇系統的URL重定向提出的。
解決方案
URL重定向從技術上將,目前可以透過兩種方式實現,一種是基於URL rewrite,另一種是基於PATH_INFO。例如http://www.gbunix.com/bbs/ftopic102.html就是基於rewrite實現的,而http://www.gbunix.com/article/article.php/515是基於PATH_INFO實現的。
針對PHPBB論壇的改造,我們分別就這兩種技術分別介紹。
一.使用rewrite技術實作:
修改phpBB程式碼:
開啟/includes/page_header.php文件,
搜尋程式碼:
//
// Generate logged in/logged out status
//
之前加:
ob_start();
function replace_for_mod_rewrite(&$s)
{
$urlin =
array(
"'(?<!/)viewforum.php?f=([0-9]*)&topicdays=([0-9]*)&start=([0-9]*)'",
"'(?<!/)viewforum.php?f=([0-9]*)&mark=topics'",
"'(?<!/)viewforum.php?f=([0-9]*)'",
"'(?<!/)viewtopic.php?t=([0-9]*)&view=previous'",
"'(?<!/)viewtopic.php?t=([0-9]*)&view=next'",
"'(?<!/)viewtopic.php?t=([0-9]*)&postdays=([0-9]*)&postorder=([a-zA-Z]*)& ;start=([0-9]*)'",
"'(?<!/)viewtopic.php?t=([0-9]*)&start=([0-9]*)&postdays=([0-9]*)&postorder =([a-zA-Z]*)&highlight=([a-zA-Z0-9]*)'",
"'(?<!/)viewtopic.php?t=([0-9]*)start=([0-9]*)'",
"'(?<!/)viewtopic.php?t=([0-9]*)'",
"'(?<!/)viewtopic.php&p=([0-9]*)'",
"'(?<!/)viewtopic.php?p=([0-9]*)'",
);
$urlout = array(
"viewforum\1-\2-\3.html",
"forum\1.html",
"forum\1.html",
"ptopic\1.html",
"ntopic\1.html",
"ftopic\1-\2-\3-\4.html",
"ftopic\1.html",
"ftopic\1-\2.html",
"ftopic\1.html",
"sutra\1.html",
"sutra\1.html",
);
$s = preg_replace($urlin, $urlout, $s);
return $s;
}
開啟/includes/page_tail.php文件,
搜尋程式碼:
$db->sql_close();
之後加:
$contents = ob_get_contents();
ob_end_clean();
echo replace_for_mod_rewrite($contents);
global $dbg_starttime;
如果你的phpBB是2.06版本,打開includes/functions.php文件,
搜尋程式碼:
if (!empty($db))
{
$db->sql_close();
}
後面加上:
if (stristr($url, 'http://')) {
header('Location: ' . $url);
exit;
}
最後在bbs目錄下建立.htaccess 文件,文件內容為:
RewriteEngine On
RewriteRule ^forums.* index.php
RewriteRule ^forum([0-9]*).* viewforum.php?f=$1&mark=topic
RewriteRule ^viewforum([0-9]*)-([0-9]*)-([0-9]*).* viewforum.php?f=$1&topicdays=$2&start=$3
RewriteRule ^forum([0-9]*).* viewforum.php?f=$1
RewriteRule ^ptopic([0-9]*).* viewtopic.php?t=$1&view=previous
RewriteRule ^ntopic([0-9]*).* viewtopic.php?t=$1&view=next
RewriteRule ^ftopic([0-9]*)-([0-9]*)-([a-zA-Z]*)-([0-9]*).* viewtopic.php?t=$1&postdays =$2&postorder=$3&start=$4
RewriteRule ^ftopic([0-9]*)-([0-9]*).* viewtopic.php?t=$1&start=$2
RewriteRule ^ftopic([0-9]*).* viewtopic.php?t=$1
RewriteRule ^ftopic([0-9]*).html viewtopic.php?t=$1&start=$2&postdays=$3&postorder=$4&highlight=$5
RewriteRule ^sutra([0-9]*).* viewtopic.php?p=$1
如果你的伺服器不支援.htaccess,請開啟httpd.conf文件,編輯你的虛擬主機部分,如下:
<VirtualHost 1.2.3.4 >
ServerAdmin [email protected]
DocumentRoot /home1/ftp/trotter/www
ServerName www.gbunix.com
RewriteEngine On
RewriteRule ^/bbs/forums.* /bbs/index.php
RewriteRule ^/bbs/forum([0-9]*).* /bbs/viewforum.php?f=$1&mark=topic
RewriteRule ^/bbs/viewforum([0-9]*)-([0-9]*)-([0-9]*).* /bbs/viewforum.php?f=$1&topicdays=$2&start=$3
RewriteRule ^/bbs/forum([0-9]*).* /bbs/viewforum.php?f=$1
RewriteRule ^/bbs/ptopic([0-9]*).* /bbs/viewtopic.php?t=$1&view=previous
RewriteRule ^/bbs/ntopic([0-9]*).* /bbs/viewtopic.php?t=$1&view=next
RewriteRule ^/bbs/ftopic([0-9]*)-([0-9]*)-([a-zA-Z]*)-([0-9]*).* /bbs/viewtopic. php?t=$1&postdays=$2&postorder=$3&start=$4
RewriteRule ^/bbs/ftopic([0-9]*)-([0-9]*).* /bbs/viewtopic.php?t=$1&start=$2
RewriteRule ^/bbs/ftopic([0-9]*).* /bbs/viewtopic.php?t=$1
RewriteRule ^/bbs/ftopic([0-9]*).html /bbs/viewtopic.php?t=$1&start=$2&postdays=$3&postorder=$4&highlight=$5
RewriteRule ^/bbs/sutra([0-9]*).* /bbs/viewtopic.php?p=$1
ErrorLog logs/gbunix.com-error_log
CustomLog logs/gbunix.com-access_log combined
</VirtualHost>
如果你用的不是虛擬主機,將RewriteRule部分程式碼放到httpd.conf檔最後就可以。
注意:非常重要的一點,為了系統的安全,請在bbs發布目錄下建立robots.txt文件,文件內容如下:
Disallow: /your-forum-folder/sutra*.html$
Disallow: /your-forum-folder/ptopic*.html$
Disallow: /your-forum-folder/ntopic*.html$
Disallow: /your-forum-folder/ftopic*asc*.html$
給apache安裝mod_rewrite模組
如果你的伺服器apache還沒有安裝,那很簡單,在編譯apache時將mod_rewrite模組編譯進去就可以,相關文件可以在www.gbunix.com中找到。如果你的apache已經安裝好了,現在只想編譯出mod_rewrite.so模組,在apache中進行加載,下面我們就介紹這個方法。
以Solaris作業系統進行範例:
# PATH=/usr/local/bin:/usr/sfw/bin:/usr/ccs/bin:$PATH
# export PATH
# which gcc
# which make
# find ./ -name mod_rewrite.c //在apache的安裝目錄中尋找mod_rewrite.c文件
# cd PATH/to/mod_rewrite.c //進入包含mod_rewrite.c檔案的目錄
# apxs -c mod_foo.c //apxs請指定絕對路徑,在你目前正在使用apache的bin目錄裡
# apxs -i -a -n mod_rewrite mod_rewrite.la
如果沒有錯誤的話,應該在你的apache的modules目錄中編譯出一個mod_rewrite.so檔。
編輯httpd.conf文件,確認httpd.conf中已經包含mod_rewrite.so的載入語句,如下:
LoadModule rewrite_module modules/mod_rewrite.so
這時,你的apache應該已經支援rewrite了。
二.基於PATH_INFO技術實作:
修改phpBB程式碼:
開啟overall_header.tpl文件,在首行加如下程式碼:
<base href=" http://www.your-forum.com/forum-dir/ ">
開啟config. php文件,在?>前面加入以下程式碼:
if ($REQUEST_METHOD == "GET") {
if (strlen(getenv('PATH_INFO')) > 1) {
$GET_array = array();
$PHP_SELF = str_replace(getenv('PATH_INFO'), '', $PHP_SELF);
$vars = explode('/', substr(getenv('PATH_INFO'), 1));
for ($i=0, $n=sizeof($vars); $i<$n; $i++) {
if (strpos($vars[$i], '[]')) {
$GET_array[substr($vars[$i], 0, -2)][] = $vars[$i+1];
} else {
$HTTP_GET_VARS[$vars[$i]] = $vars[$i+1];
}
$i++;
}
if (sizeof($GET_array) > 0) {
while (list($key, $value) = each($GET_array)) {
$HTTP_GET_VARS[$key] = $value;
}
}
}
}
if ($REQUEST_METHOD == "POST") {
if (strlen(getenv('PATH_INFO')) > 1) {
$POST_array = array();
$PHP_SELF = str_replace(getenv('PATH_INFO'), '', $PHP_SELF);
$vars = explode('/', substr(getenv('PATH_INFO'), 1));
for ($i=0, $n=sizeof($vars); $i<$n; $i++) {
if (strpos($vars[$i], '[]')) {
$POST_array[substr($vars[$i], 0, -2)][] = $vars[$i+1];
} else {
$HTTP_POST_VARS[$vars[$i]] = $vars[$i+1];
}
$i++;
}
if (sizeof($GET_array) > 0) {
while (list($key, $value) = each($POST_array)) {
$HTTP_POST_VARS[$key] = $value;
}
}
}
}
開啟functions.php文件,在?>前加入以下程式碼:
function replace_for_mod_rewrite($s) {
$s = str_replace("?", "/", $s);
$s = str_replace("&", "/", $s);
$s = str_replace("&", "/", $s);
$s = str_replace("=", "/", $s);
return $s;
}
開啟sessions.php文件,用下面程式碼取代原來定義的append_sid()函數:
function append_sid($url, $non_html_amp = false)
{
global $SID;
if ( !empty($SID) && !preg_match('#sid=#', $url) && !preg_match('#sid/#', $url) && !stristr( $_SERVER["HTTP_USER_AGENT"] ,'bot ') && !stristr($_SERVER["HTTP_USER_AGENT"] ,'inktomi'))
{
$url .= ( ( strpos($url, '?') != false ) ? ( ( $non_html_amp ) ? '&' : '&' ) : '?' ) . $SID ;
}
$url=replace_for_mod_rewrite($url);
return $url;
}
這時,你的論壇URL將會映射成( http://www.domain/bbs/viewtopic.php/t/4 )這個方式。
參考文獻:
?t=