Рекомендуемый способ выпустить HTTP redirect из MediaWiki является вызов redirect()
метод на OutputPage экземпляр (или в зависимости от того, например, вы были приняты, или глобальный экземпляр $wgOut
). Этот метод принимает в качестве параметров URL-адрес и, необязательно, код состояния HTTP (по умолчанию 302).
(Вы также можете просто вызвать функцию PHP header()
непосредственно, но с использованием метода OutputPage, менее вероятно, мешать другому коду, который может также требуется установить специальные заголовки HTTP.)
Если то, что у вас есть это Title, вы можете получить соответствующий URL-адрес, вызвав на нем getFullURL()
. Если вы просто имя страницы, передать его Title::newFromText()
(или к одному из других статических фабричных методов в классе Title, где это уместно), чтобы получить объект заголовка для него, как это:
$title = Title::newFromText($pageName);
if ($title) {
global $wgOut;
$wgOut->redirect($title->getFullURL());
}
else {
// we've got a bogus page name, deal with it somehow
}
Обратите внимание, что вызов redirect()
делает не отменяет запрос или даже отправляет код ответа сразу —, он просто устанавливает внутренний флаг, который заставляет OutputPage испускать соответствующие HTTP-заголовки при вызове метода output()
. В зависимости от того, какие крючки вы используете в своем расширении, вы можете установить их возвращаемое значение (и/или любые флагов, зависящие от конкретного приложения), чтобы сообщить MediaWiki, что нет никакой необходимости отображать какой-либо фактический контент для этой страницы.
Ps. Хотя в приведенном выше примере используется устаревшая глобальная переменная $wgOut
для получения экземпляра OutputPage, в современном коде MediaWiki вы должны получить его с текущего RequestContext. Многие классы MediaWiki реализуют интерфейс IContextSource, включая SpecialPage, Skin, Title, WebRequest и сам OutputPage, поэтому вы можете получить RequestContext из любого из них. (Конечно, если у вас уже есть объект OutputPage, вы должны просто использовать его напрямую.)