2010-10-06 93 views

回答

4

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

您也可以参考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一样 - 此页面不会重定向您。

+0

我相信'mod_rewrite'不会将URL重写为'index.php?title = Foo_bar'。链接被重写(如果有的话)到索引。php/Foo_bar',然后通过$ _SERVER ['REQUEST_URI']'或类似的东西读取。 – lonesomeday 2010-10-08 20:52:10

6

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

请注意(与MediaWiki一样)代码不会轻微分离。如果你想复制它,你需要提取逻辑,而不是简单地重新使用类。

的逻辑看起来是这样的:

  • 解码字符引用(例如& eacute;)
  • 转换空间,以强调
  • 检查标题是否是一个命名空间的引用或wiki的
  • 删除哈希碎片(例如Apple#Name
  • 删除禁止的字符
  • 禁止子目录链接(例如../directory/page
  • 禁止三重波浪序列(~~~)(出于某种原因)
  • 限制的大小为255个字节
  • 首字母大写

而且,我认为我说得对引号不需要由原始用户编码 - 浏览器可以透明地处理它们。

我希望有帮助!

+0

如何处理段名称([[Apple#Name] here],#Name_here位)...?你说'删除哈希碎片'就好像它们被忽略一样。 – 2013-02-26 03:42:15

+0

“禁止三重代字符串序列(~~~)(出于某种原因)” - 三重代字符[已扩展](https://www.mediawiki.org/wiki/Help:Signatures)在页面保存中进行签名,因此它使感觉不允许他们在标题中(链接到这样的页面会很棘手或不可能)。 – leo 2014-12-15 10:57:53