No comments have been added to this post yet.

Permalinks Structure Changed (如何保持链接稳定?)

Wordpress提供了虚拟站点目录结构的功能叫做Permalink,这个功能非常好也非常要命。如果你还对Permalink不太了解的话,我前面有文章请搜索。说它要命因为如果组织不好链接也会变得不稳定,为此我也想了好几天,今天痛下决心把Permalink的结构改变一下,长痛不如短痛,这下好多站点的链接和搜索引擎的链接要失效了,真是舍不得呀。

对于Permalink的认识我也是逐步的,最早也不清楚这个功能是干什么用的,后来慢慢了解了,才知道它的重要性,在这之前已经改过2次结构了,第一次把我自定义的前缀去掉了,因为我发现这个前缀没有任何意义,反而使链接长度加长了。第二次把uri最后一部分的%postname%改为了%post_id%,全部结构前后对比为:

最早:
http://yx.takeback.net/2004/04/08/hello-world/(uri)
http://site/%year%/%monthnum%/%day%/%postname%/(结构及标签)
之后:
http://yx.takeback.net/2004/04/08/1/(uri)
http://site/%year%/%monthnum%/%day%/%post_id%/(结构及标签)

%postname%即是标题缩语(slug),比如你的标题是hello world,那么缩语即是hello-world,因为当时版本还是1.2,对UTF-8的缩语还不支持,所以我发现用缩语这种方法来组织URI也是不科学的,当然缩语的好处就是你能一下从链接看出文章的标题并联想到其内容,这其实仅仅对西方用户有利,对东亚语言来说并无优点,不过后来WP开始支持UTF-8的标题缩语了,这是后话,暂时不提了。还有一点就是缩语可以人为更改,一改链接也会变化了。所以我觉得%post_id%是最佳选择,也就是今天以前的链接结构。

不过后来我开始发现/%year%/%monthnum%/%day%/这几个不稳定因素会影响到最稳定因素%post_id%,因为Blog的编排方式是按时间戳(timestamp),某些原因下你会编辑时间戳,总之这也是一个可以人为更改的的变量,那么链接也会随之改变了。而且我觉得链接中的“年月日”没有多大意义,反而影响了链接美观,会让链接太长了。

所以我决定最后改一次,把链接结构改为:
http://site/%post_id%/

这个id是无法人为修改的(除非动数据库),是唯一和固定的,是符合链接美观原则滴,左思右想也没有想到会有什么冲突的存在,因为id是一串数字,不会对现有文件及目录造成冲突。

所以后来的朋友请汲取我的这些教训,在设置链接结构时要三思而行。注意如果你喜欢用%postname%官方建议一定不要仅仅使用,而要在前面加其他结构标签比如年月日之类的,因为你不定什么时候标题缩语会和现有的目录名或者文件名重复而造成冲突。

现在我要暂时吃下的苦果就是要丢失所有的站外链接和搜索引擎中的链接,大概要用几个月的时间来恢复吧,这次,我认了,下次,打死也不改了。

39 Comments

  1. 亿城雪 Comments @ 09:51:42 on 2005-01-09

    为什么我的link是这样的?跟您的不同?
    http://www.baiyang.net/?p=282

  2. deadline Comments @ 11:04:31 on 2005-01-09

    我的博客日期显示为January 1st, 1970这种形式,不知道是不是数据库的原因,也或者是Php的?不知道你有没有好的解决方法!

  3. tinyfool Comments @ 11:17:27 on 2005-01-09

    有点意思

  4. legend Comments @ 12:29:04 on 2005-01-09

    ———————————————-
    deadline说:

    Comment | 2005-01-09-星期日 @ 11:04:31
    我的博客日期显示为January 1st, 1970这种形式,不知道是不是数据库的原因,也或者是Php的?不知道你有没有好的解决方法!
    ———————————————-

    可能是数据库中日期不正确,unix时间戳是从1970.1.1到现在的秒数,你那显示January 1st, 1970的话,只能说明数据库中或者取出后的时间 不正确

  5. zephur Comments @ 13:04:19 on 2005-01-09

    Permalinks除了使链接美观还有什么作用么?
    google好像可以搜索到我的任意页面了

    服务器好像不支持mod_rewrite,改成index/%post_id%/丑了点,而且我的分类目录因为中文无效勒(这个dark你是怎么解决的?)改php?

  6. deadline Comments @ 13:20:57 on 2005-01-09

    legend:
    那应该如何解决这种问题?有没有什么好一些的办法?谢谢!

  7. dark Comments @ 18:55:01 on 2005-01-09

    亿雪:你需要后台设置Permalink功能
    zephur:请参看Google的网站管理员指南文章,文章指出:

    如果采用动态网页(即网址中包含”?”字符),请注意并非每一个搜索引擎 Spider 收录动态网页都能像收录静态网页一样容易。缩短参数的长度并减少参数数目将有助于收录动态网页。

    分类目录现在支持缩语(Slug)了,你用英文命名即可。

    deadline:你试试手工指定文章时间戳。

  8. Deadline Comments @ 19:21:28 on 2005-01-09

    试过但问题依旧,我发现悠游印象的博客也存在此问题,会不会是Wordpress的程序漏洞?

  9. dark Comments @ 19:34:24 on 2005-01-09

    你们都是同一个主机商,说明问题可能出在数据库或者php程序上。原因现在不太好说。但不会是WP,因为WP上讨论过,已经将GMT时间更改为utc时间。

  10. lemonhall Comments @ 19:45:04 on 2005-01-09

    这就是我讨厌Permalinks的原因,因为我在使用WP的初期写的很多文章的地址,已经散布在网络上了。Permalinks只会让这些地址变成废链接。。。。。这会让很多读者看见链接后却只是链接到你的主页上,却找不到特定的文章!

    如果我是读者,我会感到恼怒。

    至于GOOGLE的建议,大可不必理会。据我观察,GOOGLE一般会滞后三到五天左右,但是…..如果你加入了它的广告计划。。嘿嘿,更新的速度会大大加快。

    根据StatStraq的记录,BAIDU很勤快的。至于GOOGLE所说的“并不是”每一个搜索引擎。。。。那是它美国的情况。关我们什么事情!!!???

    我们中国的网页大多都是使用了ASP前台+数据库后台的架构,BAIDU啊,一搜啊,是很照顾由动态技术生成的网页的。这个技术的核心问题在于,你的动态网页生成的速度(就是SPIDER抓网页的时候会设置一个超时)

    而WP每次输出的时间,非常快。(不信你看管理界面上的时间!)所以大可不必担心:)。

    建议是为了加快INDEX.PHP的输出速度,将阅读的文章数目不要设置得太大,8-10就可以了。太多了肯定会比较慢!

    所以Permalinks在我看来,真的就只是美观而已。

  11. deadline Comments @ 20:00:32 on 2005-01-09

    谢谢了,我的问题已解决,虽然不知道是不是Wordpress程序的问题!但是我的程序出错的时候是昨天升到1.8号的版本之后造成的,今天又导回1.6号就没问题,便又顺便升到今天的版本也没有问题。

    嗯,不是服务器的问题,因为上午我已问过客服并检查过数据库和Linux 主机!! 还有这个问题应该不是GMT和utc的问题,我觉得应该是PHP程序的问题,在一些Php编程站的讨论中出现过1970的问题!

  12. dark Comments @ 20:27:27 on 2005-01-09

    lemon:所以说这个Permalink很要命(所以我说过这个功能是Blog的核心功能之一)。美观和稳定对链接来说是非常重要的,所以我要痛改结构(我那个86那个文章在这次Pr的异动中不可思议的升到2现在也废了)。而且对于搜索引擎来说,Google是最受到信任的,我自己几乎从不用其他搜索引擎,所以它就是风向标,得以它为准则呀,没办法啊。

  13. lemonhall Comments @ 21:02:31 on 2005-01-09

    呵呵,不是的啦,如果是那样的话。你可以去WP SUPPORT上面看看,那个问题都有遇到:)只是那几天的版本中出现的一个BUG。干脆使用CVS版本算了,最近我干脆下CVS版本玩了。

  14. dark Comments @ 21:07:06 on 2005-01-09

    我RP好?我也是0107版,没有这个问题。其实Nightly也是CVS输出的,大概晚一天,一般不是纠正什么大Bug我还是直接下Nightly。我一般先用比较软件对比一下有哪几个文件改动,然后就只上传这几个文件就完了。

  15. kDolphin Comments @ 21:07:35 on 2005-01-09

    我由于服务器原因只能用/index.php/post_id这样的格式,而且trackback用permalink就失效。上次下定决心放弃permalink,实在不想搞这个了。
    yahoo对我的页面索引的很好。

  16. legend Comments @ 21:08:12 on 2005-01-09

    搜索引擎已经没有那么挑剔了,如果网站没有被搜索引擎收录或者被索引的页面很少,也不用急,过段时间就好了。google虽然每天都来看,但是大规模的收录也是周期性的。还有网站上放上google ads,机器人来的就勤了。最好给每个页面指定不同的description,这样搜索结果就不会被过滤了。

  17. kDolphin Comments @ 21:11:17 on 2005-01-09

    我比较赞成lemonhall,permalink更多的只是美观而以。既然大部分主流搜索引擎都可以对动态地址做索引,也就不用太执着使用permalink,原来怎样就怎样。

  18. dark Comments @ 21:18:05 on 2005-01-09

    sorry deadline and lemonhall,刚刚在WP的BUG系统中看到,日期问题的确是0108的一个BUG,现在已经修正了。错误号636.

  19. dark Comments @ 21:29:41 on 2005-01-09

    legend,你是说meta里面的Keywords?那就比较考人了。还是写文章前的Excerpt?这个似乎在XML输出和查询存档时有。页面html中还看不到。bot到是经常来,可并不是经常的检索你的变化。所以往往在Google中还是老样子。

    对于Permalink,我的意思是如果你的主机能够使用这个功能,那么当然最好,毕竟有利于美化。这是前提,在能使用的情况下,一定要考虑好结构,就像我举出的自己的例子,经常变动要吃亏的。因为WP给出的一些Tag实在是有不稳定因素。

  20. zephur Comments @ 21:53:45 on 2005-01-09

    恩,偶试验过,google基本上可以搜到我的所有文章,其他搜索引擎就没兴趣勒
    permalink要求的mod_rewrite国内很多空间提供商都禁掉了,index.php/%在某些地方还不完善,?看看也不错:)

  21. deadline Comments @ 22:10:02 on 2005-01-09

    关于日期显示成1970的原因找出来了,是template-functions-general.php文件的问题,已解决!

  22. deadline Comments @ 22:13:29 on 2005-01-09

    只顾着留言了,原来Bug已经发出来了哈,白忙了早知道等等好啦省着累了半天才查出来!郁闷~

  23. 亿城雪 Comments @ 09:38:04 on 2005-01-10

    俺改成/%post_id%/以后,所有的link全部失效,是怎么回事啊?
    俺又改回来了。

  24. kDolphin Comments @ 09:51:14 on 2005-01-10

    512j不支持mod_rewrite,所以只能用/index.php/%post_id%/的格式

  25. 亿城雪 Comments @ 13:13:47 on 2005-01-10

    明白了,谢谢海豚。

  26. 亿城雪 Comments @ 15:19:17 on 2005-01-10

    对了,你的blog在bloglines里面rss报错。

  27. mulberry Comments @ 18:08:44 on 2005-01-10

    hehe,我也接受建议,只用post_id了。

    虽然现在可以用中文postname了,但是显示出来的是实在不是人读的。
    在url上用postname的一个潜在好处是,google搜索能排到前面,它先看地址里面的关键词。

  28. dark Comments @ 18:59:21 on 2005-01-10

    嗯,Postname对西方用户来说比较实在,东亚文字就不行了,尽管现在WP支持生成UTF8的Slug但一个汉字三个字节会把链接搞得老长除非你自己每次都把Slug编辑成英文,只能通过浏览器的悬停指示看状态栏才能看懂标题是什么

  29. xpoint Comments @ 16:35:14 on 2005-01-11

    有些犯懒不想改了:)
    还是保持时间+ID的方式也还好。

  30. 桑林志 Trackbacks @ 15:35:34 on 2005-01-17

    中文WordPress Planet

    使用magpie和WordPress建立了一个中文WordPress Planet。
    类似 WordPress Planet,中文WordPress Planet 聚合中文WordPress用户和开发者的心得与想法,方便所有WordPress使用者查阅,获取信息与寻求帮助。
    欢迎…

  31. 大头绿豆 Comments @ 01:06:00 on 2005-01-21

    只有在Permalinks设置成http://site/%year%/%monthnum%/%day%/%post_id%/的时候,我的站点日历上的链接才正确(也是,否则就显示http://site/inde,不知道是为什么?我看了许多人的站点,他们的日历链接都与Permalinks格式不同(包括你的),不知道哪儿出了问题?

  32. 大头绿豆 Comments @ 01:06:17 on 2005-01-21

    如果您知道,请回信给我。谢谢。

  33. 大头绿豆 Comments @ 01:07:57 on 2005-01-21

    不好意思,前面打错了。
    正确的表述是:

    只有在Permalinks设置成http://site/%year%/%monthnum%/%day%/%post_id%/的时候,我的站点日历上的链接才正确(也是http://site/%year%/%monthnum%/%day%/),否则就只能是 http://site/inde ,无法正常工作。不知道是为什么?我看了许多人的站点,他们的日历链接都与Permalinks格式不同(包括你的),不知道哪儿出了问题?

  34. 大头绿豆 Comments @ 01:44:18 on 2005-01-21

    我晕。前面都删除吧。
    这样:

    我的站点只有在Permalinks设置成http://site/%year%/%monthnum%/%day%/%post_id%/的时候,日历上的链接才能正常工作(也是http://site/%year%/%monthnum%/%day%/的形式),否则(比如设置成/%postname%/)就只能是 http://site/inde 这样的错误的形式,按月归档的链接也错误了。不知道是为什么。

    我看了许多人的站点,他们的日历链接都与Permalinks格式不同(包括你的),不知道是哪儿出了问题?

  35. dark Comments @ 07:58:41 on 2005-01-21

    我看你是WP1.2,1.2不支持Utf8的Postname(这个和你的Post slug标题缩语有关),当然也不支持比如utf8的中文分类名等,比如你的标题是中文的话那么就会出现你说的问题,除非你自己注意一下,用英文来命名每个文章的Slug。不知你明白没有。
    wp1.5全面支持utf8的分类、缩语(Slug)等。

  36. 大头绿豆 Comments @ 11:20:14 on 2005-01-21

    我试过用英文来命名每个文章的slug,而且也能正常工作。我可能没表述清楚,我的问题是,当我不是使用类似http://site/%year%/%monthnum%/%day%/%post_id%/这样的permalink的时候,文章链接仍然正常(甚至使用slug),但是日历(calendar)上的链接就无法正常工作了,会显示 http://site/inde 这样的无效链接。

  37. dark Comments @ 12:35:58 on 2005-01-21

    我这篇文章的意思就是旨在说明%Post_id%是最稳定的Tag。%Postname%对中文用户并不适用。而在前面加%monthnum%和%day%其实意思不大(日历会自动用上这2个Tag)。你既然使用%Postid%正常的话,那就对了。我的经验认为:/site/%postid%/这样的结构是比较科学的,中间毋须再加其他Tag。

  38. 大头绿豆 Comments @ 15:06:31 on 2005-01-21

    您还是没了解我的意思。我是说,假如我不使用完整的%year%month%day%这种形式的permalink,我的日历上的链接就无法正常工作,只会得到 http://site/inde 这样形式的链接。

    事实上,我使用 slug 也是正常的,而且我觉得 slug 是最科学的permalink形式。只是如同我上面所说的,如果我使用了slug或者/site/%postid%之类的形式,我的日历上的链接就只能得到 http://site/inde 。只有在使用完整的year/month/day,它才能正常工作。我想问,哪里可以设置日历上的permalink,还有按月归档的。

    如果还是不清楚,能否提供您的msn messenger账号,我在方便的时候把这种情况再现给你看。

  39. dark Comments @ 15:52:01 on 2005-01-21

    明白了。估计是1.2的Permalink还是不够完善。你可以尝试升级到WP1.5。1.5较1.2更完善了在未配置Mod_rewrite模块下Permalink的实现。具体转换内容在.htaccess文件中使用正则表达式进行地址替换的(不过一般建议不要去动)。