2010-10-06 13 views
5

Jak Wikipedia (lub MediaWiki w ogóle) koduje tytuły stron w URI? To nie jest normalne kodowanie URI, ponieważ spacje są zastępowane podkreśleniami, a podwójne cudzysłowy nie są kodowane i takie rzeczy.Wikipedia (MediaWiki) Kodowanie URI

Odpowiedz

4

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_%28technical_restrictions%29 - tutaj masz jakiś opis tego, co ich silnik wymusza na nazwach artykułów.

Powinny mieć coś takiego w swoim LocalSettings.php: $ wgArticlePath = '/ wiki/$ 1';

i poprawna konfiguracja URI serwera - wydaje się, że używają Apache (nagłówek HTTP), więc prawdopodobnie jest to mod_rewrite. http://www.mediawiki.org/wiki/Manual:Short_URL

Możesz także odwołać się do pliku index.php, aby uzyskać artykuł na temat Wikipedii: http://en.wikipedia.org/w/index.php?title=Foo%20bar i uzyskać przekierowanie przez silnik do http://en.wikipedia.org/wiki/Foo_bar. Za kulisami mod_rewrite tłumaczy go na /index.php?title=Foo_bar. W przypadku silnika MediaWiki jest tak samo, jak w przypadku odwiedzin http://en.wikipedia.org/w/index.php?title=Foo_bar - ta strona nie przekierowuje.

+0

Wierzę, że 'mod_rewrite' nie przepisuje adresów URL na' index.php? Title = Foo_bar'. Linki są przerobione (jeśli w ogóle) na "indeks".php/Foo_bar', a następnie odczytane przez '$ _SERVER ['REQUEST_URI']' lub coś podobnego. – lonesomeday

6

Proces jest dość skomplikowany i nie jest całkiem ładny. Musisz spojrzeć na klasę Title znalezioną w includes/Title.php. Powinieneś zacząć od metody newFromText, ale większość logiki jest w metodzie secureAndSplit.

Należy zauważyć, że (jak zawsze w przypadku MediaWiki) kod nie jest oderwany w najmniejszym stopniu. Jeśli chcesz go powielić, musisz wyodrębnić logikę, zamiast po prostu ponownie użyć tej klasy.

Logika wygląda mniej więcej tak:

  • referencje znakowe Decode (np & eacute;)
  • Konwersja obowiązuje do podkreślenia
  • Sprawdź, czy tytuł jest nawiązaniem do nazw lub interwiki
  • Usuń fragmenty haszujące (np. Apple#Name
  • Usuń niedozwolone znaki
  • Nie zezwalaj na linki do podkatalogów (np. ../directory/page)
  • zabraniajcie potrójne sekwencje tyldy (~~~) (z jakiegoś powodu)
  • ograniczenie wielkości 255 bajtów
  • pierwszą literę

Ponadto uważam, że mam rację, mówiąc, że cudzysłowy nie muszą być zakodowane przez oryginalnego użytkownika - przeglądarki mogą obsługiwać je w sposób przezroczysty.

Mam nadzieję, że to pomoże!

+0

A w jaki sposób przetwarzane są nazwy sekcji ([[nazwa Apple # tutaj], bit #Name_here) ...? Powiedziałeś "usuń fragmenty mieszające" tak, jakby były ignorowane. –

+0

"Zabronione potrójne sekwencje tyldy (~~~) (z jakiegoś powodu)" - Potrójne tyldy [są rozszerzone] (https://www.mediawiki.org/wiki/Help:Signatures) do podpisów na stronie zapisz, więc robi nie pozwalać im na tytuł (byłoby to trudne lub niemożliwe do połączenia z taką stroną). – leo