8

Wikipedia(或一般的 MediaWiki)如何在 URI 中编码页面标题?这不是普通的 URI 编码,因为空格被下划线替换,双引号没有被编码等等。

4

2 回答 2

7

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_%28technical_restrictions%29 - 在这里你有一些关于他们的引擎对文章名称强制执行的描述。

他们的 LocalSettings.php 中应该有这样的内容: $wgArticlePath = '/wiki/$1';

并且正确的服务器 URI 重写配置 - 他们似乎正在使用 Apache(HTTP 标头),所以它可能是 mod_rewrite。http://www.mediawiki.org/wiki/Manual:Short_URL

你也可以参考 Wikipedia 上的一篇文章的 index.php 文件,如下所示:http://en.wikipedia.org/w/index.php?title=Foo%20bar并被引擎重定向到http://en.wikipedia.org/wiki/Foo_bar. 在幕后 mod_rewrite 将它翻译成 /index.php?title=Foo_bar。对于 MediaWiki 引擎,它就像您访问过一样 http://en.wikipedia.org/w/index.php?title=Foo_bar- 此页面不会重定向您。

于 2010-10-08T02:25:14.830 回答
7

这个过程非常复杂,并不完全漂亮。您需要查看Title. includes/Title.php您应该从newFromText方法开始,但大部分逻辑都在secureAndSplit方法中。

请注意(与 MediaWiki 一样)代码丝毫没有解耦。如果要复制它,则需要提取逻辑而不是简单地重新使用该类。

逻辑看起来像这样:

  • 解码字符引用(例如 é)
  • 将空格转换为下划线
  • 检查标题是否是对命名空间或跨维基的引用
  • 删除哈希片段(例如Apple#Name
  • 删除禁用字符
  • 禁止子目录链接(例如../directory/page
  • 禁止三重波浪号序列 ( ~~~)(出于某种原因)
  • 将大小限制为 255 字节
  • 首字母大写

此外,我相信我说引号不需要由原始用户编码是正确的——浏览器可以透明地处理它们。

我希望这会有所帮助!

于 2010-10-07T17:54:09.117 回答