我在2009年4月份,借由网站搬家的契机,把blog的后台程序由WordPress换成了Movable Type。为了效率方面的原因,我选择让Movable Type生成静态页面,因此,我目前的单篇blog的URL由过去的“/年/月/标题/”变成了“/年/月/标题.html”的形式。这样有个很大的缺点:搜索引擎收录了很多老文章,都是用旧的格式发布的。如果有人在搜索引擎里点击了一个旧的URL,就会在浏览器里得到404错误。虽然只要把URL结尾的“/”手动的改成“.html”就能正常访问,但由于用户不了解,用户就无法看到正常的页面。
理想的解决方案是设定RewriteRule,加上一条规则,把旧的链接301转向到新的链接。这样不仅用户可以没有障碍的直接浏览新的页面,旧链接在搜索引擎里累计的权重也会转到新链接下。但我对.htaccess的语法始终不了解,今天晚上试了很久,都是得到500错误,最后不得不退而求其次,选择设定一个404页面,提示用户手动修改链接,虽然很囧但也只能如此了。
让浏览器在遇到404错误的时候自动转到别的页面的设定很简单,只要在.htaccess文件里加上一行
ErrorDocument 404 /404.html
就行了。其中“/404.html”是我的404页面的存放地址。
有了这一行,只要弄个404.html文件放在blog的根目录下就OK了。我用Google Webmasters提供的javascript代码试了一下,确实可行:浏览器不是给出错误信息,而是给出一个Google的搜索条,默认设定为用Google搜索本站文章。不过不是很美观,我想把它嵌入到我的正常blog背景里去,而不是突兀的放一个搜索条。
其实方法很简单,在Movable Type里建立一个页面,文件名设为404.html,然后把内容输进去就行了。我现在感觉自己相当的蠢──我把它想的太复杂了。
我想的是把代码放到Movable Type的Templates列表里面去,让Movable Type来给我自动生成。我看到有个叫“Dynamic Error”的模板,感觉挺像,就把自己写的代码插了进去,结果不管用。后来我看到“Template Options”下面有“Link to File”的设定,想也不想就在里面填入了“404.html”,还是不行。不光如此,我发现Movable Type用我本来写的404.html文件替代了原本的模板,而我也无法再undo回去了。
没办法,就用quick and dirty的方法,从另一个目录安装了一个Movable Type(MT支持sqlite非常方便,不用设定数据库),想把相同的设定拷过来。实行之前我偶然点了一下模板编辑的右下角下拉菜单里的“Refresh Template(s)”选项,结果装完了Movable Type之后发现默认模板莫名其妙的已经恢复了。-_-||
然后就是我领悟了开头写的方法,把在404页面上要放的文字和Google Webmasters给的javascript代码放到页面里去,一切搞定。