前两天将博客固定链接中最后的那个 id 换成了文章的缩略名,这下可惨了,搜索引擎们都得重新抓取一遍,我可懒得等他,当然,也怕给谷歌百度神马的降权了,于是有了这篇文章:
首先我的思路是通过 PHP 插入一段代码,识别到链接中最后一个参数为数字 id 则自动到数据库中查询并 301 到新地址。
于是问了问 Google 大哥,PHP 怎么获得伪静态的地址,这点问题对谷歌来说毫无压力——$_SERVER['ORIG_PATH_INFO']——就是他,然后便轮到正则了,由于是数字,这部分也很简单:.+\/([0-9]+)\.html
完成了,接下来的步骤便是用 PHP 将这堆东西整理起来:
/* KK's 301 */ preg_match('/.+\/([0-9]+)\.html/i', $_SERVER['ORIG_PATH_INFO'], $matches); if($matches[1]){ $post_id = $matches[1]; $query = $db->sql()->select('slug')->from('table.contents')->where('cid = ?', $post_id); $result = $db->fetchRow($query); $url = str_replace($post_id, urlencode($result['slug']), $_SERVER['ORIG_PATH_INFO']); header('HTTP/1.1 301 Moved Permanently'); header("Location: {$url}"); exit(); }
然后——最后一步当然是找个地方放这段代码啦,根据我对 Typecho 的一些了解,应该放在 index.php 中,这是 Typecho 的核心,所有页面都会被伪静态到这个 PHP 中。
因为我们这里用到了 Typecho 的数据库类,所以代码应该放在“include config.inc.php”的后面(这个config文件初始化了数据库类) 其次留意到 Typecho 注释:
/** 开始路由分发 */ Typecho_Router::dispatch();
显然,我们的代码应该放在它前面,不然系统会比你先输出个 404 页面。
好了,我们再打开个以“文章id.html”结尾的页面,看看代码是否正常即可。
(PS:由于我忘了更新CDN缓存,还以为代码错了⊙﹏⊙b)
博主是否提供博客模板的开发,这个博客模板不是wordpress吧。很简约啊。
理论上是没问题啦,不过我没啥艺术细菌,所以只能做些修改或者山寨别的网站… :evil: