如何提高在google中的排名
——search engine friendly的url設計
關鍵詞:"url rewrite" mod_rewrite isapi rewrite path_info iis "search engine friendly" "isapi_rewrite"
内容摘要:不得不承認,将動态網頁連結rewriting成靜态連結是最保險和穩定的面向搜尋引擎優化方式此外随着網際網路上的内容以驚人速度的增長也越來越突出了搜尋引擎的重要性,如果網站想更好地被搜尋引擎收錄,網站設計除了面向使用者友好(user friendly)外,搜尋引擎友好(search engine friendly)的設計也是非常重要的。進入搜尋引擎的頁面内容越多,則被使用者用不同的關鍵詞找到的幾率越大。在google的算法調查一文中提到一個站點被google索引頁面的數量其實對pagerank也是有一定影響的。由于google 突出的是整個網絡中相對靜态的部分(動态網頁索引量比較小),連結位址相對固定的靜态網頁比較适合被google索引(怪不得很多大網站的郵件清單歸檔和blog按日期歸檔的文檔很容被搜的到),是以很多關于面向搜尋引擎 url設計優化(uri pretty)的文章中提到了很多利用一定機制将動态網頁參數變成像靜态網頁的形式:
比如可以将:
http://phpunixman.sourceforge.net/index.php?mode=man¶meter=ls
變成:
http://phpunixman.sourceforge.net/index.php/man/ls
實作方式主要有2種:
* 基于url rewrite
iis的isapi rewrite下載下傳(免費)
* 基于path_info
把uri位址用作參數傳遞:url rewrite
最簡單的是基于各種web伺服器中的url重寫轉向(rewrite)子產品的url轉換:
這樣幾乎可以不修改程式的實作将 news.asp?id=234 這樣的連結映射成news/234.html,從外面看上去和靜态連結一樣。apache伺服器上有一個子產品(非預設):mod_rewrite:url rewrite功能之強大足夠寫上一本書。
當我需要将将news.asp?id=234的映射成news/234.html時,隻需設定:
rewriterule /news/(\d+)\.html /news\.asp\?id=$1 [n,i]
這樣就把 /news/234.html 這樣的請求映射成了 /news.asp?id=234
當有對/news/234.html的請求時:web伺服器會把實際請求轉發給/news.asp?id=234
而在iis也有相應的rewrite子產品:比如isapi rewrite和iis rewrite,文法都是基于正規表達式,是以配置幾乎和apache的mod_rewrite是相同的:
比對于某一個簡單應用可以是:
rewriterule /news/(\d+)\.html /news/news\.php\?id=$1 [n,i]
這樣就把 http://www.chedong.com/news/234.html 映射到了 http://www.chedong.com/news/news.php?id=234
一個更通用的能夠将所有的動态頁面進行參數映射的表達式是:
把 http://www.myhost.com/foo.php?a=a&b=b&c=c
表現成 http://www.myhost.com/foo.php/a/a/b/b/c/c。
rewriterule (.*?\.php)(\?[^/]*)?/([^/]*)/([^/]*)(.+?)?$1(?2$2&:\?)$3=$4?5$5: [n,i]
以下是針對phpbb的一個apache mod_rewrite配置樣例:
rewriteengine on
rewriterule /forum/topic_(.+)\.html$ /forum/viewtopic.php?t=$1 [l]
rewriterule /forum/forum_(.+)\.html$ /forum/viewforum.php?f=$1 [l]
rewriterule /forum/user_(.+)\.html$ /forum/profile.php?mode=viewprofile&u=$1 [l]
這樣設定後就可以通過topic_1234.html forum_2.html user_34.html這樣的連結通路原來的動态頁面了。
通過url rewrite還有一些好處:
mod_rewrite和isapirewrite基本相容,但是還是有些不同,比如:isapirewrite中"?"需要轉義成"\?",mod_rewrite不用,isapirewrite支援 "\d+" (全部數字),mod_rewrite不支援
* 隐藏背景實作:這在背景應用平台的遷移時非常有用:當從asp遷移到java平台時,對于前台使用者來說,根本感受不到背景應用的變化;
* 簡化資料校驗:因為像(\d+)這樣的參數,可以有效的控制數字的格式甚至位數;比如我們需要将應用從news.asp?id=234遷移成news.php?query=234時,前台的表現可以一直保持為 news/234.html。從實作應用和前台表現的分離:保持了url的穩定性,而使用mod_rewrite甚至可以把請求轉發到其他背景伺服器上。
基于path_info的url美化
url美化的另外一個方式就是基于path_info:
path_info是一個cgi 1.1的标準,經常發現很多跟在cgi後面的"/value_1/value_2"就是path_info參數:
比如:http://phpunixman.sourceforge.net/index.php/man/ls 中:$path_info = "/man/ls"path_info是cgi标準,是以php servlet等都有的支援。比如servlet中就有request.getpathinfo()方法。
注意:/myapp/servlet/hello/foo的 getpathinfo()傳回的是/foo,而/myapp/dir/hello.jsp/foo的getpathinfo()将傳回的/hello.jsp,從這裡你也可以知道jsp其實就是一個servlet的path_info參數。asp不支援path_info
php中基于path_info的參數解析的例子如下:
//注意:參數按"/"分割,第一個參數是空的:從/param1/param2中解析出$param1 $param2這2個參數
if ( isset($_server["path_info"]) ) {
list($nothing, $param1, $param2) = explode('/', $_server["path_info"]);
}
如何隐蔽應用:例如 .php,的擴充名:
在apache中這樣配置:
forcetype application/x-httpd-php
如何更像靜态頁面:app_name/my/app.html
解析的path_info參數的時候,把最後一個參數的最後5個字元“.html”截斷即可。
注意:apache2中預設是不允許path_info的,需要設定 acceptpathinfo on特别是針對使用虛拟主機使用者,無權安裝和配置mod_rewrite的時候,path_info往往就成了唯一的選擇。
ok,這樣以後看見類似于http://www.example.com/article/234這樣的網頁你就知道可能是 article/show.php?id=234這個php程式生成的動态網頁,很多站點表面看上去可能有很多靜态目錄,其實很有可能都是使用1,2個程式實作的内容釋出。比如很多wikiwiki系統都使用了這個機制:整個系統就一個簡單的wiki程式,而看上去的目錄其實都是這個應用拿後面的位址作為參數的查詢結果。
利用基于mod_rewrite/path_info + cache伺服器的解決方案對原有的動态釋出系統進行改造,也可以大大降低舊有系統更新到新的内容管理系統的成本。并且友善了搜尋引擎收錄入索引。
附:如何在iis上利用php支援path_info
php的isapi模式安裝備忘:隻試成 php-4.2.3-win32
解包目錄
========
php-4.2.3-win32.zip c:\php
php.ini初始化檔案
=================
複制:c:\php\php.ini-dist 到 c:\winnt\php.ini
配置檔案關聯
============
按照install.txt中的說明配置檔案關聯
運作庫檔案
==========
複制 c:\php\php4ts.dll 到 c:\winnt\system32\php4ts.dll
這樣運作後:會發現php把path_info映射到了實體路徑上
warning: unknown(c:\chedong\downloads\ariadne\www\test.php\path): failed to create stream: no such file or directory in unknown on line 0
warning: unknown(): failed opening 'c:\chedong\downloads\ariadne\www\test.php\path' for inclusion
(include_path='.;c:\php4\pear') in unknown on line 0
安裝ariadne的patch
==================
停止iis服務
net stop iisadmin
ftp://ftp.muze.nl/pub/ariadne/win/iis/php-4.2.3/php4isapi.dll
覆寫原有的c:\php\sapi\php4isapi.dll
注:
ariadne是一個基于path_info的内容釋出系統,
php 4.3.2 rc2中cgi模式的path_info已經修正,照常安裝即可。
參考資料:
url rewrite文檔:
isapi rewrite文檔
http://httpd.apache.org/docs/mod/mod_rewrite.html
http://httpd.apache.org/docs-2.0/mod/mod_rewrite.html
搜尋引擎友好的url設計
http://www.sitepoint.com/article/485
說不定這個url原來就是articel.php?id=485
一個基于path_info的開源内容管理系統
http://typo3.com/
google的pagerank算法說明:
http://pr.efactory.de/
備注:
我的網站的文章系統和下載下傳系統也已經采用了isapi_rewrite
下載下傳位址:http://www.helicontech.com/download/#isapi_rewrite
安裝完畢後,配置httpd.ini檔案如下:
[isapi_rewrite]
rewriterule /file/(\d+)\.html /file/list\.asp\?id=$1 [n,i]
rewriterule /download/(\d+)\.html /download/list\.asp\?id=$1 [n,i]
# defend your computer from some worm attacks
rewriterule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [f,i,o]
這樣就可以把送出/file/100.html的轉換成/file/list.asp?id=100
把/download/10.html轉換成/download/list.asp?id=10