Вопрос по коду пхп

D
На сайте с 28.06.2008
Offline
1114
1105

Скачал этот плагин для удаления дублей Джумлы http://hekima.ru/downloads/shnodoubles.zip

Он работает по принципу все неверные возможные комбинации урлов перекидывает 301 редиректом на правильный урл. Все замечательно все работает.

Как тут и говорилось http://joomlaforum.ru/index.php/topic,156030.msg943178.html#msg943178 еще правил файл application.php

Установил этот плагин на 4 сайта. И лишь на одном он работает без ошибок, на 3-х других при редиректе очень быстро проскакивает ошибка

Fatal error: Call to undefined method plgSystemShnodoubles::close() in /var/www/user/data/www/site.ru/libraries/joomla/application/application.php on line 334

Вот строки файла application.php с 329 по 334

header($moved ='HTTP/1.1 301 Moved Permanently');
header('Location: '.$url);
}
}

$this->close();

Для корректного ответа поисковикам строку 329 я меня с

header($moved ? 'HTTP/1.1 301 Moved Permanently' : 'HTTP/1.1 303 See other');

на

header($moved ='HTTP/1.1 301 Moved Permanently');

Почему вылезает эта ошибка?

Joker-jar
На сайте с 26.08.2010
Offline
171
#1

По идее, надо

header('HTTP/1.1 301 Moved Permanently');

И это, лучше юзать "SERVER_PROTOCOL", ибо, допустим, с Nginx в бекендах 1.1 будет давать лаги.

D
На сайте с 28.06.2008
Offline
1114
#2

Попробовал Ваш вариант - ошибка не пропала. Nginx у меня стоит.

Joker-jar
На сайте с 26.08.2010
Offline
171
#3

Вообще, ругается на метод close(); Сложно судить, что там не так по такому маленькому кусочку кода.

Joker-jar добавил 30.11.2011 в 15:22

при редиректе очень быстро проскакивает ошибка

после

header('HTTP/1.1 301 Moved Permanently');

можно добавить exit(); не очень красиво, но должно проканать

D
На сайте с 28.06.2008
Offline
1114
#4

Прописал так:

header('HTTP/1.1 301 Moved Permanently');
exit();
header('Location: '.$url);
}
}

$this->close();

Ошибка не пропала, по прежнему ругается на $this->close();

C
На сайте с 04.02.2005
Offline
291
#5

header('HTTP/1.1 301 Moved Permanently');


header('Location: '.$url);
exit();

Так правильнее

Chukcha добавил 30.11.2011 в 15:40

Но все же еще нужно знать, что до этого происходит... зачем и почему выполняется close()

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#6

Да убери ты этот close() и всё :)

Он может просто базу закрывает.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
D
На сайте с 28.06.2008
Offline
1114
#7

Если убираю close() ошибка пропадает, редирект проходит медленнее и ответ сервера неправильному урлу становится - 200

Dram добавил 30.11.2011 в 15:58

Chukcha:
header('HTTP/1.1 301 Moved Permanently');


header('Location: '.$url);
exit();



Так правильнее

Chukcha добавил 30.11.2011 в 15:40
Но все же еще нужно знать, что до этого происходит... зачем и почему выполняется close()

Ошибка не пропала

ВОт больше кода

	function redirect( $url, $msg='', $msgType='message', $moved = false )

{
// check for relative internal links
if (preg_match( '#^index[2]?.php#', $url )) {
$url = JURI::base() . $url;
}

// Strip out any line breaks
$url = preg_split("/[\r\n]/", $url);
$url = $url[0];

// If we don't start with a http we need to fix this before we proceed
// We could validly start with something else (e.g. ftp), though this would
// be unlikely and isn't supported by this API
if (!preg_match( '#^http#i', $url )) {
$uri =& JURI::getInstance();
$prefix = $uri->toString(Array('scheme', 'user', 'pass', 'host', 'port'));

if ($url[0] == '/') {
// we just need the prefix since we have a path relative to the root
$url = $prefix . $url;
}
else {
// its relative to where we are now, so lets add that
$parts = explode('/', $uri->toString(Array('path')));
array_pop($parts);
$path = implode('/',$parts).'/';
$url = $prefix . $path . $url;
}
}


// If the message exists, enqueue it
if (trim( $msg )) {
$this->enqueueMessage($msg, $msgType);
}

// Persist messages if they exist
if (count($this->_messageQueue)) {
$session =& JFactory::getSession();
$session->set('application.queue', $this->_messageQueue);
}

// If the headers have been sent, then we cannot send an additional location header
// so we will output a javascript redirect statement.
if (headers_sent()) {
echo "<script>document.location.href='$url';</script>\n";
}
else {
if (!$moved && strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'webkit') !== false) {
// WebKit browser - Do not use 303, as it causes subresources reload (https://bugs.webkit.org/show_bug.cgi?id=38690)
echo '<html><head><meta http-equiv="refresh" content="0;'. $url .'" /></head><body></body></html>';
}
else {
// All other browsers, use the more efficient HTTP header method
header($moved ='HTTP/1.1 301 Moved Permanently');
header('Location: '.$url);
}
}

$this->close();
}
Joker-jar
На сайте с 26.08.2010
Offline
171
#8

При удалении строки №334 ($this->close();) не может не пропасть ошибка

Fatal error: Call to undefined method plgSystemShnodoubles::close() in /var/www/user/data/www/site.ru/libraries/joomla/application/application.php on line 334
D
На сайте с 28.06.2008
Offline
1114
#9

А она пропадает :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий