Wikipedia (MediaWiki) Схема кодирования URI - PullRequest
7 голосов
/ 06 октября 2010

Как Википедия (или MediaWiki в целом) кодирует заголовки страниц в URI? Это не нормальная кодировка URI, поскольку пробелы заменяются символами подчеркивания, а двойные кавычки не кодируются и тому подобное.

Ответы [ 2 ]

7 голосов
/ 07 октября 2010

Процесс довольно сложный и не совсем красивый. Вам нужно взглянуть на класс Title, найденный в includes/Title.php. Вы должны начать с метода newFromText, но основная часть логики находится в методе secureAndSplit.

Обратите внимание, что (как всегда с MediaWiki) код не развязан ни в малейшей степени. Если вы хотите воспроизвести его, вам нужно извлечь логику, а не просто повторно использовать класс.

Логика выглядит примерно так:

  • Декодировать ссылки на символы (например, & eacute;)
  • Преобразование пробелов в подчеркивания
  • Проверьте, является ли заголовок ссылкой на пространство имен или вики
  • Удалить фрагменты хеша (например, Apple#Name
  • Удалить запрещенные символы
  • Запретить ссылки на подкаталоги (например, ../directory/page)
  • Запретить тройную последовательность тильды (~~~) (по некоторым причинам)
  • Ограничить размер до 255 байт
  • Прописать первую букву

Кроме того, я считаю, что я прав, говоря, что кавычки не должны кодироваться исходным пользователем - браузеры могут обрабатывать их прозрачно.

Надеюсь, это поможет!

6 голосов
/ 08 октября 2010

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 - эта страница не перенаправляет вас.

...