Рекомендуемый способ выдачи HTTP-перенаправления из MediaWiki - это вызов метода redirect()
для экземпляра OutputPage (независимо от того, какой экземпляр вы передали, или глобального экземпляра $wgOut
). Этот метод принимает в качестве параметров URL-адрес и, необязательно, код состояния HTTP (по умолчанию 302 ).
(Вы также можете просто вызвать функцию PHP header()
напрямую, но использование метода OutputPage с меньшей вероятностью будет мешать другому коду, который также может захотеть установить специальные заголовки HTTP.)
Если у вас есть объект Title , вы можете получить соответствующий URL, вызвав getFullURL()
. Если у вас просто есть имя страницы, передайте его Title::newFromText()
(или, при необходимости, одному из других статических методов фабрики в классе Title), чтобы получить для него объект 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()
не прерывается запрос или даже сразу отправляется код ответа & mdash; он просто устанавливает внутренний флаг, который заставляет OutputPage выдавать соответствующие заголовки HTTP, когда вызывается метод output()
. В зависимости от того, какие именно хуки вы используете в своем расширении, вы можете установить их возвращаемое значение (и / или любые специфичные для хука флаги), чтобы сообщить MediaWiki, что нет необходимости отображать какой-либо фактический контент для страницы.
Ps. Хотя в приведенном выше примере устаревшая глобальная переменная $wgOut
используется для получения экземпляра OutputPage, в современном коде MediaWiki его следует получить из текущего RequestContext . Многие классы MediaWiki реализуют интерфейс IContextSource, включая SpecialPage, Skin, Title, WebRequest, а также сам OutputPage, так что вы можете получить RequestContext из любого из них. (Конечно, если у вас уже есть объект OutputPage, вы должны просто использовать его напрямую.)