windows 主機服務器的網站以搭建在虛擬主機上,當我們用習慣了 apache 下的.htaccess 的時候,很難想象 windows 主機上怎麼實現它的強大功能。實際上 windows 主機服務器上的虛擬主機可以用 httpd.ini 文件來充當.htaccess 文件在 Linux 主機空間的作用,不過要令你失望的是,httpd.ini 的功能完全沒有.htaccess 那麼強大,規則上沒有那麼豐富,細節上也有很大的不同。如果你在 win 主機上安裝了 WordPress,那麼對付 WordPress 固定鏈接的設置將是一件令你頭痛的事。本文致力解決這一問題,並儘量詳盡。

一、 httpd.ini 實現域名 301 重定向:

[ISAPI_Rewrite]
RewriteCond Host: ^utubon.com$
RewriteRule (.*) http://www.utubon.com$1 [R,I,L]

這不是本文的重點,只不過跟本文的 SEO 有點關係,順帶寫上,一筆帶過。

二、 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]

將上面的代碼保存在一個名叫 httpd.ini 的文本文件中 (用 txt 文件直接修改文件名),上傳到 web 根目錄,這樣 win 主機下就能實現 WordPress 的固定鏈接了,並且你可以放心大膽的將後台設置固定鏈接中的“/index.php/” 去除掉。

如果你在 linux 主機下了解過.htacess 文件的使用,那麼應該對此段代碼不會陌生。只不過在 httpd.ini 中需要排除/sitemap.xml 等類似的單獨頁面,如果不在加上這些相關語句,那麼你的 WordPress 將會返回給用户“ 頁面未找到” 的提示,原因正如你想到的一樣,因為你做了 RewriteRule /(.*)/index.php/$1 [L] 的規定,所以當你訪問/sitemap.xml 實際上已經重寫到/index.php/sitemap.xml 了,自然沒有該頁面。如果你還不明白不清楚語句的意思,你可以看本文參考來源,或到網上尋找.htaccess 的教程方只其中奧妙。

雖然網上還有其他的辦法,但本人認為這是最好的方法。在上傳了 httpd.ini 之後,雖然實現了最初的固定鏈接網址形式,但有一個不太讓人容易注意到的地方是,當你點擊某個標籤時,會發現找不到該頁,原因是你的網址中含有中文字符,需要做如下修改:

修改網站目錄下 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');

三、解決?p=postid 形式的文章短連接仍然可以訪問的問題

你可能對這種 rewrite 規則比較熟悉,國內的程序基本上都是用這種 Rewrite 。請注意這時 WP 的內部過程完全不同,WP 的 query vars 值均來源於 $_GET(Apache 直接 rewrite 生成的), 但 Request_uri 或 Path_Info 仍會被解析並且生成的 $perma_query_vars 完全正確,只是不會被用於 query vars 而已。因為 $_GET 優先級高於對 url rewrite 獲得的值,因此在 windows 下 IIS 的 httpd.ini 里加入 rewrite 規則,後台 permalink 設置為默認後 rewrite 後友好地址仍可以訪問。為了使網站更有利於 SEO,減少不同網址卻內容相同的情況,我們對文章頁、分類頁、單獨頁面做如下處理:

在 WordPress 主題文件頭部文件或能夠被全局訪問的文件內加入如下代碼

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.1 301 Moved Permanently');//發出 301 頭部
header('Location: '.bloginfo('url').'/'.$name.'/');
exit();
}else if($_GET['cat']){
$id=$_GET['cat'];
$cat=get_category($id);
$name=$cat->slug;
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.bloginfo('url').'/cat/'.$name.'/');
exit();
}else if($_GET['tag']){
$name=$_GET['tag'];
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.bloginfo('url').'/tag/'.$name.'/');
exit();
}

這段代碼根據網址中是否包含 p,page_id,cat,tag 參數進行跳轉,進入其別名為網址的頁面。你也可以根據這種方法,來跳轉更多的頁面。當然這只是簡單的處理方法,如果你的要求不是很高,可以使用該方法,如果你使用了其他的插件導致網址中出現 p 等參數,則需要寫更多的代碼來排除它。

由於 win 主機在這方面的嚴重缺陷,故建議使用 WordPress 建站的朋友儘量選擇 U 主機,這樣對各種自定義功能的實現更加直接。 《完》