2010-10-06 2 views
5

Comment Wikipedia (ou MediaWiki en général) code-t-il les titres de page dans les URI? Ce n'est pas un codage URI normal, puisque les espaces sont remplacés par des traits de soulignement et que les guillemets doubles ne sont pas codés et des choses comme ça.Wikipédia (MediaWiki) Schéma d'encodage URI

Répondre

4

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_%28technical_restrictions%29 - vous avez ici une sorte de description de ce que leur moteur applique sur les noms d'articles.

Ils devraient avoir quelque chose comme ça dans leur LocalSettings.php: $ wgArticlePath = '/ wiki/$ 1'; U12 réécrit la configuration - ils semblent utiliser Apache (en-tête HTTP), donc c'est probablement mod_rewrite. http://www.mediawiki.org/wiki/Manual:Short_URL

Vous pouvez également consulter le fichier index.php pour un article sur Wikipedia comme ceci: http://en.wikipedia.org/w/index.php?title=Foo%20bar et être redirigé par le moteur à http://en.wikipedia.org/wiki/Foo_bar. Dans les coulisses, mod_rewrite le traduit en /index.php?title=Foo_bar. Pour le moteur MediaWiki c'est pareil que si vous avez visité http://en.wikipedia.org/w/index.php?title=Foo_bar - cette page ne vous redirige pas.

+0

Je crois que 'mod_rewrite' ne réécrit pas les URL à' index.php? Title = Foo_bar'. Les liens sont réécrits (le cas échéant) à 'index.php/Foo_bar' et ensuite lu par '$ _SERVER ['REQUEST_URI']' ou quelque chose de similaire. – lonesomeday

6

Le processus est assez complexe et n'est pas exactement joli. Vous devez regarder la classe Title trouvée dans includes/Title.php. Vous devriez commencer par la méthode newFromText, mais la majeure partie de la logique se trouve dans la méthode secureAndSplit.

Notez que (comme toujours avec MediaWiki) le code n'est pas découplé le moins du monde. Si vous voulez le répliquer, vous devrez extraire la logique plutôt que de simplement réutiliser la classe.

La logique ressemble à ceci:

  • références de caractères Decode (par exemple & EACUTE;)
  • Convertir les espaces en underscores
  • Vérifiez si le titre est une référence à un espace de noms ou Interwiki
  • Supprimer les fragments de hachage (par exemple Apple#Name
  • Supprimer les caractères interdits
  • Interdire les sous-répertoires (par ex. ../directory/page)
  • Interdisez séquences tilde triple (~~~) (pour une raison quelconque)
  • Limiter la taille à 255 octets
  • Capitaliser la première lettre

De plus, je crois que je ne me trompe pas en disant que les guillemets n'ont pas besoin d'être encodés par l'utilisateur original - les navigateurs peuvent les gérer de manière transparente.

J'espère que cela aide!

+0

Et comment sont traités les noms de section ([[Nom Apple # ici]], le bit #Name_ici) ...? Vous avez dit "supprimer les fragments de hachage" comme s'ils étaient ignorés. –

+0

"Interdire les séquences de trois tilde (~~~) (pour une raison quelconque)" - Triple tildes [sont étendus] (https://www.mediawiki.org/wiki/Help:Signatures) aux signatures sur la page de sauvegarde, de sorte qu'il fait sens de ne pas les autoriser dans les titres (il serait difficile ou impossible de lier une telle page). – leo