最近刚把wordpress博客从linux服务器更换到windows服务器,无意间发现中文标签点击报404错误(后来百度只有iis环境才会有这个问题),找不到页面,404错误对seo优化肯定是不又好的,所以赶紧想办法处理。刚开始以为数据没有转移完全,又重新转移了一次,但是故障依旧。没有办法,还是得需要解决啊!于是百度搜索“wordpress 中文标签404”,很多完美解决方案就唰唰的出来了。
首先找了一个方法马上通过FTP测试,发现神奇的中文标签可以用了。
方法如下:
1.在网站的根目录的wp-includes文件夹中找到“rewrite.php”这个文件。
2.备份一下“rewrite.php”,以防修改出错(改代码之前我们都最好备份一下原代码)。
3.打开“rewrite.php”文件中我们找到如下代码:
function get_tag_permastruct() {if (isset($this->tag_structure)) {return $this->tag_structure;}if (empty($this->permalink_structure)) {
//修改这句
$this->tag_structure = '';return false;}if (empty($this->tag_base))$this->tag_structure = $this->front . 'tag/';else$this->tag_structure = $this->tag_base . '/';$this->tag_structure .= '%tag%';return $this->tag_structure;}
将其中的
" if (empty($this->permalink_structure)) { ”
修改为“
if (!empty($this->permalink_structure)) { "
注意这个里面只加了一个英文“!”号。
虽然中文tag标签没问题了,但是去访问内页的时候,发现伪静态失效了。没办法只能还原刚才修改的rewrite.php文件(记得修改任何文件之前都要备份),继续搜索其他方法……
终于功夫不负有心人,又找到一个完美方案,测试中文404真的没有报错了,方法如下:
1.打开wp-include文件夹,找到并打开编辑class-wp.php文件;
2.查找代码:
$pathinfo = $_SERVER['PATH_INFO'];
把这句代码替换成:
$pathinfo = mb_convert_encoding($_SERVER['PATH_INFO'], "UTF-8", "GBK");
3.查找代码:
$req_uri = $_SERVER['REQUEST_URI'];
把这句代码替换成:
$req_uri = mb_convert_encoding($_SERVER['REQUEST_URI'], "UTF-8", "GBK");
由于自己较懒惰,方案里面提供了修改好的class-wp.php文件,于是我直接下载上传了,测试页面伪静态也没有问题,其他访问也没问题。
…………
第二天我去发布文章,上传图片的时候发现图片上传不了,以为是自己开的CDN加速的原因,于是乎用测试域名去测试发现还是无法上传,以为是插件冲突了,全部停止还是不行,再次怀疑自己转移数据没有转移完全,再去转了一次,重新转移测试图片上传成功,又去把之前修改的class-wp.php文件上传以后,去测试图片上传失败,还原此文件上传成功。
终于找到原因了,原来上面的方法还是有瑕疵,再去仔细一看教程,原来只适用wordpress3.5以下的版本。
心灰意冷,再去找方法,终于找到一个适用于wordpress4.1版本的方法,如下:
1.首先找到wordpress的wp-includes目录下-》class-wp.php文件,进行如下修改就可以解决在Windows系统下部分中文标签无法打开的情况。
2.wp-includes/class-wp.php 153 行:
$pathinfo = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : '';
修改为:
$pathinfo = isset( $_SERVER['PATH_INFO'] ) ? mb_convert_encoding($_SERVER['PATH_INFO'],'utf-8', 'GBK') : '';
3.wp-includes/class-wp.php 157 行:
list( $req_uri ) = explode( '?', $_SERVER['REQUEST_URI'] );
修改为:
list( $req_uri ) = explode( '?', mb_convert_encoding($_SERVER['REQUEST_URI'], 'utf-8','GBK') );
然后将class-wp.php文件保存并上传覆盖原文件。然后再全面测试伪静态、中文标题、图片上传都正常,此时终于完美解决。
在搜索的时候还找到了其他方法,未测试不知道是否可以解决,版本不同,方法不同,可以自行参考。
WordPress3.1之前版本,方法如下:
打开 WP-include/classes.php(3.1之前版本)或WP-include/class-wp.php(3.1+之后版本,下文称新版)找到第154行(新版为142行),把:
$pathinfo = $_SERVER['PATH_INFO';
替换为:
$pathinfo = mb_convert_encoding($_SERVER['PATH_INFO'], 'UTF-8', 'GBK');
找到第159行(新版为147行),把:
$req_uri = $_SERVER['REQUEST_URI';
替换为:
$req_uri = mb_convert_encoding($_SERVER['REQUEST_URI'], 'UTF-8', 'GBK');
还有方法如下:
登录wordpress后台,在文章标签里。给每一个含中文的Tags标签,加上一个标签别名。“别名” 是URL友好的另外一个名称。它通常为小写并且只能包含字母,数字和连字符。
对于上百个以上中文Tags标签的博客,此种方法工作量巨大。
还有说是ISAPI_Rewrite伪静态的规则没有写好才导致找不到网页文件的。其实就是更改一下规则就可以了:之前的tag伪静态的规则
RewriteRule /tag/(.*)$ /index\.php\?tag=$1
更改后的规则
RewriteRule /tag/(.*)/$ /index\.php\?tag=$1
经成都SEO博主测试无效果。