我在寫晉遠信息網(www.geofuture.net)時沒有考慮到URL如何面向搜索引擎優化,完成了以后才開始優化的。這時要考慮一方面要靜態的URL,一方面要盡量保持原有的程序不變以便于以后維護,所以就采用url_rewrite的方法。下面是httpd.conf中相應的部分
| 以下為引用的內容: <VirtualHost *:80> DocumentRoot /home/geofuture ServerName www.geofuture.net ServerAlias *.geofuture.net geofuture.net *.cic123.com DirectoryIndex index.files index.html index.php RewriteEngine On #RewriteLog logs/rewrite.log #RewriteLogLevel 9 #RewriteRule / http://geofuture.vicp.net/ [L] RewriteCond %{REQUEST_FILENAME} index.files [OR] RewriteCond %{REQUEST_FILENAME} error.files [OR] RewriteCond %{REQUEST_FILENAME} cat.files [OR] RewriteCond %{REQUEST_FILENAME} area.files [OR] RewriteCond %{REQUEST_FILENAME} info.files [OR] RewriteCond %{REQUEST_FILENAME} topic.files [OR] RewriteCond %{REQUEST_FILENAME} post.files [OR] RewriteCond %{REQUEST_FILENAME} profile.files [OR] RewriteCond %{REQUEST_FILENAME} userinfo.files [OR] RewriteCond %{REQUEST_FILENAME} cert.files [OR] RewriteCond %{REQUEST_FILENAME} revise.files [OR] RewriteCond %{REQUEST_FILENAME} review.files [OR] RewriteCond %{REQUEST_FILENAME} feedback.files [OR] RewriteCond %{REQUEST_FILENAME} keyrank.files [OR] RewriteCond %{REQUEST_FILENAME} rss.files RewriteRule ^(. ?)/Q(.*)$ $1=$2 [N] RewriteRule ^(. ?)ZZ(. )$ $1&$2 [N] RewriteRule ^(. ?)/.files(.*)$ $1.php$2 [N] RewriteRule ^(. ?)/.php(/|&)(. ).html$ $1.php?$3 [L] ErrorDocument 400 /error.php?status=400 ErrorDocument 401 /error.php?status=401 ErrorDocument 403 /error.php?status=403 ErrorDocument 404 /error.php?status=404 ErrorDocument 405 /error.php?status=405 ErrorDocument 408 /error.php?status=408 ErrorDocument 410 /error.php?status=410 ErrorDocument 411 /error.php?status=411 ErrorDocument 412 /error.php?status=412 ErrorDocument 413 /error.php?status=413 ErrorDocument 414 /error.php?status=414 ErrorDocument 415 /error.php?status=415 ErrorDocument 500 /error.php?status=500 ErrorDocument 501 /error.php?status=501 ErrorDocument 502 /error.php?status=502 ErrorDocument 503 /error.php?status=503 ErrorDocument 506 /error.php?status=506 </VirtualHost> |
我只把以內容為主的欄目優化了,至于登錄和搜索等部分保持不變,因為這些部分也是搜索引擎不關心的。同時,一些常見的狀態碼(HTTP Status)也有相應的靜態頁面。上面只修改了外來請求的URL,而程序生成的URL通過下面的代碼實現:
| 以下為引用的內容: <?php //-------------- SECTION NAME ----------------------------------- // 動態URL改寫成靜態 function url_rewrite($buffer) { //return $buffer; $search = array( '.php', '?', '&', 'filesZZ', '=', 'hrefQ', ); $replace = array( '.files', '/', 'ZZ', 'files/ZZ', 'Q', 'href=', ); preg_match_all('/href="//(index|error|cat|area|info|topic| post|profile|userinfo|cert| revise|review|feeback|keyrank|rss) /.php(.*?)"/', $buffer, $match); $url = str_replace($search, $replace, $match[0]); $url = preg_replace('//.files(. ?)(#. ?)?"$/', '.files//1.html//2"', $url); return str_replace($match[0], $url, $buffer); } ?> |
上面的函數定義放在公共頭文件里面。然后,在需要優化的頁面開始處加入以下代碼:
ob_start("url_rewrite");
這也是原來的程序唯一需要修改的地方。這樣做還有一個問題。 例如我寫的分頁函數等代碼, 都要求原來動態的URL, 而優化了以后通過 $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] 就只能得到優化以后的靜態URL, 所有依賴于動態URL的代碼都得修改一下, 以能夠處理原來的URL和優化的。這樣得改寫公共頭文件的許多代碼。所以我就想了一個迂回的辦法:
| 以下為引用的內容: <?php //-------------- SECTION NAME ----------------------------------- // 恢復成動態URL function url_resume($url) { $search = array( '.files', '.php/', 'ZZ', '/ZZ', 'Q', '.html', ); $replace = array( '.php', '.php?', '&', '?&', '=', '', ); $url = str_replace($search, $replace, $url); return $url; } ?> |
有了上面的函數,在需要動態URL的地方只要調用一下就可以了,而不需重寫各個核心函數。需要注意的是,url_rewrite和url_resume雖然是相反的過程,但是它們的參數是不同的。前者的參數是整個緩沖區,后者只是一個單個的URL,因為恢復的情況畢竟很少,而全局處理重寫可以提高速度。
新聞熱點
疑難解答