维基百科(MediaWiki)URI编码方案

8

维基百科(或MediaWiki)如何在URI中编码页面标题?这不是普通的URI编码,因为空格被替换为下划线,双引号不会被编码,诸如此类。

2个回答

7
这个过程相当复杂,看起来并不美观。您需要查看includes/Title.php中找到的Title类。您应该从newFromText方法开始,但大部分逻辑在secureAndSplit方法中。
请注意(与MediaWiki一样),代码没有任何解耦。如果您想复制它,您需要提取逻辑而不是简单地重用类。
逻辑看起来像这样:
  • 解码字符引用(例如é)
  • 将空格转换为下划线
  • 检查标题是否是对命名空间或interwiki的引用
  • 删除哈希片段(例如Apple#Name
  • 删除禁止字符
  • 禁止子目录链接(例如../directory/page
  • 禁止三倍波浪线序列(~~~)(由于某种原因)
  • 限制大小为255字节
  • 将第一个字母大写
此外,我认为我说得对,引号不需要被原始用户编码 - 浏览器可以透明地处理它们。
希望这有所帮助!

区块名称([[Apple#此处名称]],#此处名称)如何处理?您说“删除哈希碎片”好像它们被忽略了。 - user649198
1
禁止使用三个波浪线(~~~)(由于某种原因)。三个波浪线在页面保存时会被扩展为签名,因此不允许在标题中使用它们是有道理的(这将使链接到此类页面变得棘手或不可能)。 - leo

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相同-此页面不会重定向您。


我相信 mod_rewrite 不会将 URL 重写为 index.php?title=Foo_bar。链接被重写(如果有的话)为 index.php/Foo_bar,然后由 $_SERVER['REQUEST_URI'] 或类似的东西读取。 - lonesomeday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接