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

Encoding 维基百科(MediaWiki)URI编码方案,encoding,uri,mediawiki,wikipedia,Encoding,Uri,Mediawiki,Wikipedia,Wikipedia(或MediaWiki)如何在URI中编码页面标题?这不是正常的URI编码,因为空格被替换为下划线,双引号不被编码,诸如此类。这个过程相当复杂,也不太漂亮。您需要查看includes/Title.php中的Title类。您应该从newFromText方法开始,但是大部分逻辑都在secureAndSplit方法中 请注意(与MediaWiki一样),代码丝毫没有解耦。如果要复制它,需要提取逻辑,而不是简单地重复使用该类 逻辑如下所示: 解码字符引用(例如é;) 将空

Wikipedia(或MediaWiki)如何在URI中编码页面标题?这不是正常的URI编码,因为空格被替换为下划线,双引号不被编码,诸如此类。

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

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

逻辑如下所示:

  • 解码字符引用(例如é;)
  • 将空格转换为下划线
  • 检查标题是否是对命名空间或interwiki的引用
  • 删除散列片段(例如
    Apple\Name
  • 删除禁止字符
  • 禁止子目录链接(例如,
    。/directory/page
  • 禁止三重平铺序列(
    ~~
    )(出于某种原因)
  • 将大小限制为255字节
  • 将第一个字母大写
此外,我相信我说得对,引号不需要由原始用户编码——浏览器可以透明地处理它们

我希望这能有所帮助!

-这里有一些关于他们的引擎对文章名强制执行的描述

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

正确的服务器URI重写配置——它们似乎在使用Apache(HTTP头),所以可能是mod_重写


您还可以参考index.php文件,在Wikipedia上找到这样一篇文章:
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
,然后由
$\u服务器['REQUEST\u URI'读取
或类似的东西。节名([[Apple#Name here]]和#Name#U here bit)是如何处理的…?你说的“删除散列片段”就像它们被忽略一样。“禁止三重平铺序列(~~~)(出于某种原因)”–在页面保存时对签名使用三重平铺,因此在标题中不允许它们是有意义的(链接到这样一个页面可能会很棘手或不可能)。