在 windows 主機安裝 WordPress 利用 httpd.ini 固定連結及原短連線同時訪問
windows 主機伺服器的網站以搭
建在虛擬主機上,當我們用習慣了 apache 下的.htaccess 的時候,很難想象 windows 主機上怎麼實現它的強大功能。實際上 windows 主
機伺服器上的虛擬主機可以用 httpd.ini 檔案來充當.htaccess 檔案在 Linux 主機空間的作用,不過要令你失望的是,httpd.ini 的
功能完全沒有.htaccess 那麼強大,規則上沒有那麼豐富,細節上也有很大的不同。如果你在 win 主機上安裝了 WordPress,那麼對付
WordPress 固定連結的設定將是一件令你頭痛的事。本文致力解決這一問題,並儘量詳盡。
一、 httpd.ini 實現域名 301 重定
向:[ISAPI_Rewrite]RewriteCond Host: ^toolmao.com$RewriteRule (.*)
http://www.toolmao.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 主機,這樣對各種自定義功能的實現更加直接。