解决WordPress中文附件attachment以及tag URL导致的404找不到页面问题

之前从Typecho转换到WordPress的,结果使用网上的转换程序勉强转换成功,没想到却带来了一堆后遗症,其中比较明显的就是中文url导致的404找不到页面的问题。

其实搜索“Wordpress 中文 tag 404”关键字词就可以找到大量关于这类问题以及解决方案的信息,这些解决方案无非是要求修改WordPress的wp-include/classes.php(3.1之前版本)或wp-include/class-wp.php(3.1+之后版本)的源代码,增加UTF-8与GBK的一个转换;或是修改rewrite.php改变重写规则。这些我没有去尝试,我感觉修改官方代码的做法不是很妥当的,即使修改了,以后升级什么的,原先修改的内容仍然会被替换,或者修改有可能会导致新的问题等等,所以我不建议修改官方源代码。

如果默认官方表前缀wp_的话,导致这个问题的中文tag在MySQL的位置为表wp_terms的列slug,中文附件attachment所在MySQL的位置为表wp_posts的列post_name。这次转换前我尝试着发布了一篇带有中文tag或者attachment中文名称的文章,并且访问这个tag或者附件正常,然后再查看MySQL数据库。发现其中attachment的post_name以及tag所在的slug均被改写成类似%E8%A7%A3%E6%9E%90这样的字符串,其实这类字符串是符合URL编码标准的,一般我们的输入的字符串在提交URL前均会被编码成形如这样的编码;再看看出问题的编码形式,直接是中文未经过任何编码,所以需要访问这类资源需要进行编码转换才能正常访问,否则就会出现404找不到页面的问题。

其实我们可以通过PHP内置的urlencode对attachment的post_name以及tag所在的slug进行一次编码然后再写入数据库,以避免出现这类问题,这里我对所有附件attachment的post_name进行了一次urlenocde编码,代码如下(测试前请备份数据库)

继续阅读“解决WordPress中文附件attachment以及tag URL导致的404找不到页面问题”

某些场景下请不要省去URL链接地址后的斜杠

今天在访问某个博客时,看到某位网友评论上留的网址类似于这样https://wangye.org/blog(这里以我的博客作为例子),这样貌似没有什么问题,也能正常打开这个博客,大家可能注意到在打开博客时网址自动变为https://wangye.org/blog/(多了个斜杠),为什么会这样,因为大多数人包括我喜欢将博客放到自己域名下的Blog文件夹里,那么https://wangye.org/blog指的是wangye.org下blog这个文件,当然我们只有blog这个文件夹,那么服务器会返回如下的301转向信息:

1
2
3
4
5
6
Server: Apache/2
Location: http://wangye.org/blog/
Content-Length: 293
Keep-Alive: timeout=1, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

很明显,服务器做了一次判断,进行了一次301转向,浏览器也进行了重新定向才定位到正确的/blog/文件夹,表面上看这没有什么问题,但是对于链接来说,当浏览者访问类似于https://wangye.org/blog这样的链接时,必然会对服务器造成资源负担,访问量少时没有什么,当流量比较大时不必要的资源浪费就比较可观了,还有据说这种转向不利于搜索引擎蜘蛛的抓取,所以请在这种情形下网址保留最后个斜杠,写成https://wangye.org/blog/ 吧。

Javascript取得URL传递的参数

如何使用Javascript取得URL传递的参数,也就是login.html?name=wangye在login.html取得name等于的值。对于动态网页这点很容易办到,比如ASP就可以通过Request.QueryString(“name”)的方法,但是对于Javascript则有点小麻烦。我一般参考布鲁斯狼(cnBruce)《在HTML网页中巧用URL》 讲解的办法。近日在一次分析联想网页上的某个效果时发现其中也实现了这个功能,不过其是使用正则实现的,感觉比较简洁,故分享给大家。

1
2
3
4
5
6
7
8
9
10
11
function gup( name ) {
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if( results == null ) {
        return "";
    } else {
        return results[1];
    }
}

使用方法比如要获取login.html?name=wangye传递的wangye,只要在login.html这样调用document.write(gup(“name”));这样页面就会显示name=后面的值。