簡介
httpd.ini是指wordpress程式在Windows虛擬主機上的偽靜態設定。windows主機伺服器的網站以搭建在虛擬主機上,當我們用習慣了apache下的.htaccess的時候,很難想像windows主機上怎么實現它的強大功能。實際上windows主機伺服器上的虛擬主機可以用httpd.ini檔案來充當.htaccess檔案在Linux主機空間的作用,不過要令你失望的是,httpd.ini的功能完全沒有.htaccess那么強大,規則上沒有那么豐富,細節上也有很大的不同。要在你的空間使用httpd.ini首先得確定你的空間是否支持該功能,這個可以詢問服務商,如果是企業用戶,可以要求服務商為你配置。如果你用的是你自己的獨立伺服器,那么請到網上查找資料,由於frustigor沒有找到相關的權威檔案,不敢妄言,以下的內容也只作為參考。
功能
我們來看一段簡單的httpd.ini內容實現的功能,從這段代碼講開來:
Rewriterule/(.*).html/index.php?p=$1[L]
上面這段小代碼不難讓你想像它的功能,即先開啟重寫功能,然後執行一條規則,將根目錄下後綴為.html的網址內容和/index.php?p=後面的
內容匹配。如果你訪問的是那么你可以用這個網址來訪問這個真實的地址。關於httpd.ini的部分規則,將會在下面的案例中一一講到。
一、httpd.ini實現域名301重定向:
[ISAPI_Rewrite]
RewriteCondHost:^$
RewriteRule(.*)[R,I,L]
上面這段代碼實現了將重定向到。這種方法據說是有利有SEO的,下面稍作講解:
[ISAPI_Rewrite]是開啟重寫能力的意思,每個單詞都對應了英文的原意,英語好的朋友可以揣度一下。
RewriteCond提出條件,相當於IF。Host後面跟上域名,即條件內容,域名為情況下,執行下面的規則。^是開始標記,即域名以開始,$為結尾標記,即域名以結尾。整條語句的意思“重寫條件域名以u開頭到com結束的情況下,往下執行”言外之意不符合則不執行。“”是轉義字元,在httpd.ini中需要對這種index.php中間的點加以轉義。
RewriteRule則是指執行的規則。(.*)即第一個要匹配的內容,也就是說你的用這個東西將要代替另外一樣。“.”指任意字元,“*”指這個字元重複0或更多次,如果是“+”意思為重複1或更多次。那么“(.*)”的意思就是指任意字元而且該字元可以隨意重複N次,其實就是任意內容了。後面則是將前面的(.*)代替什麼了,用$1表示。也就是說如果我輸入的是不帶WWW的那么實際上伺服器將用帶WWW的這個網址。這樣就實現了域名的重定向。再舉一例,如果規則為RewriteRule/(.*).html [R,I,L]那么只會當你用訪問時跳轉為靜態路徑。實際上這種方法我們只用在域名跳轉上,不用在單獨網頁跳轉上,從而實現301重定向。
二、httpd.ini實現域名綁定之目錄:
[ISAPI_Rewrite]
RewriteCondHost:^$
RewriteRule^(.*)$/$1[I]
RewriteCondHost:^www.
RewriteRule//(.*)$R,I]
如果按照上面一段的分析,我想你應該能慢慢理解這段代碼的內容:開啟重寫能力,如果訪問的域名是,無論後面跟隨什麼,都代替/這個網址後面的內容,如果訪問的網址是後面無論跟隨什麼內容,那么都將網址變為並後面用訪問網址後面的內容代替。這樣兩個循環,實現了子目錄/被綁定到上。
frustigor找到了綁定子目錄後將wordpress放在被綁定子目錄下面的wordpress的固定連結的辦法,雖然有些小缺陷,但總體上能實現這個想法。具體看下一頁。
三、[1]httpd.ini實現wordpress固定連結:
[ISAPI_Rewrite]
RewriteRule/sitemap.xml/sitemap.xml[L]
RewriteRule/favicon.ico/favicon.ico[L]
RewriteRule/wap(.*)/wap$1[L]
RewriteRule/content/uploads/(.*)/content/uploads/$1[L]
RewriteRule/wp-(.*)/wp-$1[L]
#RewriteRule^/$/index.php[L]
RewriteRule/(.*)/index.php/$1[L]
我想你通過前面的講解,應該可以很好的理解這段了。但是在一些細節上,你可能並不明白為什麼要這么寫,而不去掉或添加點東西。這段代碼的規則部分中你需要注意的是前面兩句實現了你仍然可以訪問這兩個檔案,如果沒有這兩句,你的wordpress會給出未找到文章的提示錯誤頁面。接下來兩句是讓你可以訪問
/wap/和/content/uploads/這兩個目錄的規則。如果沒有,那么無論你是訪問該目錄,還是從該目錄下載東西,都將被wordpress返回未找到頁面的提示。最後三句規則則是實現wordpress能夠像在Linux上採用樂觀的固定連結的形式的關鍵。本站每篇內容的網址都逃離了win主機wordpress固定連線頂層目錄被/index.php/的厄運,直接可以成為華麗的自定義網址。
四、結合上面的所有內容,或者httpd.ini的其他沒講到的規則,你可以實現更多的功能例如,你可以將第一和第三方案結合起來,不僅在將域名定向到而且可以想辦法將所有的?p=postid的網址定向到固定連結網址,這個還是比較難的,烏徒幫暫時沒有實現,希望朋友們能最終實現。
方法
採用一種根據這接收地址來跳轉的代碼,如下:
if($_GET['p']||$_GET['page_id']){
if($_GET['p'])$id=$_GET['p'];
if($_GET['page_id'])$id=$_GET['page_id'];
$post=get_post($id);
$name=$post->post_name;
header(‘HTTP/1.1301Movedpermanently’);//發出301頭部
header(‘Location:‘.bloginfo(‘url’).’/’.$name.’/');
exit();}elseif($_GET['cat']){$id=$_GET['cat'];
$cat=get_category($id);
$name=$cat->slug;
header(‘HTTP/1.1301MovedPermanently’);//發出301頭部
header(‘Location:‘.bloginfo(‘url’).’/cat/’.$name.’/');
exit();
}elseif($_GET['tag']){
$name=$_GET['tag'];
header(‘HTTP/1.1301MovedPermanently’);//發出301頭部
header(‘Location:‘.bloginfo(‘url’).’/tag/’.$name.’/');exit();}
另外,這種方法還要讓wordpress支持中文轉碼網址,必須修改wordpress源檔案:修改網站目錄下wp-include/classes.php檔案(請先行備份):(最新3.1版需要修改的檔案是wp-include/class-wp.php)
第一步:找到
$pathinfo=$_SERVER['PATH_INFO'];
修改為
$pathinfo=mb_convert_encoding($_SERVER['PATH_INFO'],‘UTF-8′,‘GBK’);
第二步:找到
$req_uri=$_SERVER['REQUEST_URI'];
修改為
$req_uri=mb_convert_encoding($_SERVER['REQUEST_URI'],‘UTF-8′,‘GBK’);
就這樣,中文的TAG標籤頁等都可以打開了的。