1. 程式人生 > >wordpress 設定靜態後標籤中中文連結找不到頁面的解決方法

wordpress 設定靜態後標籤中中文連結找不到頁面的解決方法

轉自:http://www.li.cm/news/2011/04/17/wordpress-%E8%AE%BE%E7%BD%AE%E9%9D%99%E6%80%81%E5%90%8E%E6%A0%87%E7%AD%BE%E4%B8%AD%E4%B8%AD%E6%96%87%E9%93%BE%E6%8E%A5%E6%89%BE%E4%B8%8D%E5%88%B0%E9%A1%B5%E9%9D%A2%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9.html

用win IIS主機,設定Wordpress的TAG標籤,在前臺點選進入的時候發現打不開跳到404錯誤頁,編碼問題。

所以需要把它轉換成UTF-8和GBK的編碼,下面推薦三種解決方法:
一、修改wp-includes/rewrite.php

這是網上最常見的方法,原理是,讓WordPress在對其他內容使用Permalink的時候,對tag不使用,而使用連結2的QueryString模式傳送中文編碼:

if (empty($this->permalink_structure)) { //-----this line need change------
改為

if (!empty($this->permalink_structure)) {

二、如果你用的是windows主機,還可以這樣做:

IIS會將PathInfo中的UTF-8轉換成GBK,而QueryString就不會轉換,故而為了使用Permalink,採用以下方法:
開啟wp-includes/classes.php檔案。在154到159行位置

if ( isset($_SERVER['PATH_INFO']) )
$pathinfo = $_SERVER['PATH_INFO'];
else
$pathinfo = '';
$pathinfo_array = explode('?', $pathinfo);
$pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
$req_uri = $_SERVER['REQUEST_URI'];

改為

if ( isset($_SERVER['PATH_INFO']) )
$pathinfo = mb_convert_encoding($_SERVER['PATH_INFO'], "UTF-8", "GBK");
else
$pathinfo = '';
$pathinfo_array = explode('?', $pathinfo);
$pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
$req_uri = mb_convert_encoding($_SERVER['REQUEST_URI'], "UTF-8", "GBK");

這種發放的缺點是 :只對Windows主機、且必須是Windows下的IIS主機有效。

三、修改tag base

原理同上,只要讓WordPress在打開了Permalink功能後繼續對tag不理不問就行了。那麼,欺騙WordPress,讓它用連結2的格式來顯示Permalink,可行麼?可行,因為WordPress可以自定義Permalink的形式:
在WordPress的 (設定)Settings ? (固定連結)Permalinks ? (標籤字首)Tag base 中填上
/?tag=
注意””不能少,引用原文中的寫法不對。另外要注意每次輸入””,WP都會再次轉義為””,所以每次點提交都會把””翻一倍,點兩次就是”\”,所以不要多點,一次就對了。
這個方法的結果是使得連結變成這個樣子
www.li.cm/?tag=/中文/
多出來的斜槓對於伺服器絲毫沒有影響,還是被視為QueryString,效果同上。
侷限是連結變得更加不好看了,更為致命的是外掛生成的Sitemap中,tag連結會變成錯誤的形式,如果你很在乎Sitemap,請不要使用這個方法,除非你真的無法修改自己的rewrite.php檔案。

但是當你使用WP-SuperCache或者類似的快取外掛時,它會加入自己的rewrite規則,所有請求先由自己判斷,不在快取中或者不符合快取規則才交由WordPress處理。但問題在於,它不支援中文URL的解析,哪怕是QueryString也不行。於是我們必須繞過它。
這是WP-SuperCache在.htaccess檔案裡所新增的rewrite規則

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{QUERY_STRING} !.*p=.*
RewriteCond %{QUERY_STRING} !.*attachment_id=.*
RewriteCond %{QUERY_STRING} !.*wp-subscription-manager=.*
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz [L]
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{QUERY_STRING} !.*p=.*
RewriteCond %{QUERY_STRING} !.*wp-subscription-manager=.*
RewriteCond %{QUERY_STRING} !.*attachment_id=.*
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html [L]

我們要做的就是不讓它去判斷中文tag連結,在兩個 RewriteCond %{REQUEST_METHOD} !=POST 後面分別加入這樣一句:
RewriteCond %{QUERY_STRING} !.*tag=.*

含義是如果QueryString中含有tag字樣,請不要解析(交給下一條規則,一般來說就是WordPress的index.php了)。

PS:Windows+IIS主機下,通過方案一可以完美解決中文tag問題,Linux+Apache主機下,不能使用中文Permalink,除非修改Apache,否則只有用方案一和方案三繞行。方案一是較為推薦的方法,但是搭配WP-SuperCache使用的時候,需要自己在.htaccess檔案中加入一條不處理tag連結的規則。