1

Topic: Как сделать свою страницу ошибки 404 на форуме

Часто при переходе на несуществующий адрес можно увидеть следующие ошибки:

Неверный запрос. Ссылка, по которой вы пришли, неверна или устарела.

или такое сообщеие

Sorry! The page could not be loaded.

Page Not found (Error 404):
The requested page пр/ could not be found.

Это стандартные сообщения об ошибочном обращении к тому или иному адресу. Чтобы сделать свою страницу ошибки 404 для форума PunBB, вначале создадим пустую страницу с именем 404.php и разместим ее в корне форума.
Вот содержимое страницы:

Spoiler
<?php

if (!defined('FORUM_ROOT'))
  define('FORUM_ROOT', './');
require FORUM_ROOT.'include/common.php';

if ($forum_user['g_read_board'] == '0')
  message($lang_common['No view']);

// Load the index.php language file
require FORUM_ROOT.'lang/'.$forum_user['language'].'/index.php';

// Setup main heading
$forum_page['main_title'] = forum_htmlencode($forum_config['o_board_title']);

define('FORUM_ALLOW_INDEX', 1);
define('FORUM_PAGE', 'index');
require FORUM_ROOT.'header.php';

// START SUBST - <!-- forum_main -->
ob_start();

?>  
    <div class="main-head">
    <h2 class="hn"><span>Ошибка - 404</span></h2>
  </div>
  <div class="main-content main-message">
    <p>Такой страницы не существует. </p>
    <p>Возможно вас заинтересуют следующие темы.</p>
    <p>здесь можно вывести самые горячие темы форума или другую полезную и интересную информацию. На некоторых сайтах, я заметил, многие пользователи выводят карту сайта.</p>
  </div>
<?php

$tpl_temp = forum_trim(ob_get_contents());
$tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
ob_end_clean();
// END SUBST - <!-- forum_main -->



// START SUBST - <!-- forum_info -->
ob_start();

if (file_exists(FORUM_CACHE_DIR.'cache_stats.php'))
  include FORUM_CACHE_DIR.'cache_stats.php';

// Regenerate cache only if the cache is more than 30 minutes old
if (!defined('FORUM_STATS_LOADED') || $forum_stats['cached'] < (time() - 1800))
{
  if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
    require FORUM_ROOT.'include/cache.php';

  generate_stats_cache();
  require FORUM_CACHE_DIR.'cache_stats.php';
}

$stats_list['no_of_users'] = '<li class="st-users"><span>'.sprintf($lang_index['No of users'], '<strong>'.forum_number_format($forum_stats['total_users']).'</strong>').'</span></li>';
$stats_list['newest_user'] = '<li class="st-users"><span>'.sprintf($lang_index['Newest user'], '<strong>'.($forum_user['g_view_users'] == '1' ? '<a href="'.forum_link($forum_url['user'], $forum_stats['last_user']['id']).'">'.forum_htmlencode($forum_stats['last_user']['username']).'</a>' : forum_htmlencode($forum_stats['last_user']['username'])).'</strong>').'</span></li>';
$stats_list['no_of_topics'] = '<li class="st-activity"><span>'.sprintf($lang_index['No of topics'], '<strong>'.forum_number_format($forum_stats['total_topics']).'</strong>').'</span></li>';
$stats_list['no_of_posts'] = '<li class="st-activity"><span>'.sprintf($lang_index['No of posts'], '<strong>'.forum_number_format($forum_stats['total_posts']).'</strong>').'</span></li>';

?>
<div id="brd-stats" class="gen-content">
  <h2 class="hn"><span><?php echo $lang_index['Statistics'] ?></span></h2>
  <ul>
    <?php echo implode("\n\t\t", $stats_list)."\n" ?>
  </ul>
</div>
<?php

if ($forum_config['o_users_online'] == '1')
{
  // Fetch users online info and generate strings for output
  $query = array(
    'SELECT'  => 'o.user_id, o.ident',
    'FROM'    => 'online AS o',
    'WHERE'    => 'o.idle=0',
    'ORDER BY'  => 'o.ident'
  );

  $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  $forum_page['num_guests'] = $forum_page['num_users'] = 0;
  $users = array();

  while ($forum_user_online = $forum_db->fetch_assoc($result))
  {
    if ($forum_user_online['user_id'] > 1)
    {
      $users[] = ($forum_user['g_view_users'] == '1') ? '<a href="'.forum_link($forum_url['user'], $forum_user_online['user_id']).'">'.forum_htmlencode($forum_user_online['ident']).'</a>' : forum_htmlencode($forum_user_online['ident']);
      ++$forum_page['num_users'];
    }
    else
      ++$forum_page['num_guests'];
  }

  $forum_page['online_info'] = array();
  $forum_page['online_info']['guests'] = ($forum_page['num_guests'] == 0) ? $lang_index['Guests none'] : sprintf((($forum_page['num_guests'] == 1) ? $lang_index['Guests single'] : $lang_index['Guests plural']), forum_number_format($forum_page['num_guests']));
  $forum_page['online_info']['users'] = ($forum_page['num_users'] == 0) ? $lang_index['Users none'] : sprintf((($forum_page['num_users'] == 1) ? $lang_index['Users single'] : $lang_index['Users plural']), forum_number_format($forum_page['num_users']));
  
//Кто онлайн сегодня - добавлено из расширения
$online_today_query = array(
  'SELECT'  => 'id, username',
  'FROM'    => 'users',
  'WHERE'    => 'last_visit>'.strtotime(gmdate("M d Y")),
  'ORDER BY'  => 'username'
);
$online_today_result = $forum_db->query_build($online_today_query);

$online_today = array();
while(list($ot_id, $ot_username) = $forum_db->fetch_row($online_today_result))
  $online_today[] = '<a href="'.forum_link($forum_url['user'], $ot_id).'">'.$ot_username.'</a>';  
  
?>
<div id="brd-online" class="gen-content">
  <h3 class="hn"><span><?php printf($lang_index['Currently online'], implode($lang_index['Online stats separator'], $forum_page['online_info'])) ?></span></h3>
<?php if (!empty($users)): ?>
  <p><?php echo implode($lang_index['Online list separator'], $users) ?></p>
  <?php if(!empty($online_today)) echo '<h3 class="hn"><span> Сегодня нас посетили: '.implode(', ', $online_today).'</span></h3>'; ?>
<?php endif; ($hook = get_hook('in_new_online_data')) ? eval($hook) : null; ?>
</div>
<?php
}

$tpl_temp = forum_trim(ob_get_contents());
$tpl_main = str_replace('<!-- forum_info -->', $tpl_temp, $tpl_main);
ob_end_clean();
// END SUBST - <!-- forum_info -->

require FORUM_ROOT.'footer.php';

Далее открываем файл .htaccess и добавляем где нибудь в конце

#Страницы ошибок
#Страница не найдена (в пределах сайта)
ErrorDocument 404 http://site.ru/404.php

По такому принципу можно так же создать страницу ошибки 403 для несуществующих поддоменов
В таком случае после созданного файла 403.php в файл .htaccess добавляем еще:

#для несуществующих поддоменов
ErrorDocument 403 http://site.ru/403.php

2 (edited by ozland 2016.01.22 09:52)

Re: Как сделать свою страницу ошибки 404 на форуме

Всё это правильно и хорошо, только страница ошибок должна отдавать заголовок 404 Not found. В данном случае поисковик её проиндексирует и будет считать страницей.  Чтобы этого не было, я в самое начало файла страницы ошибок вставляю заголовок

header("HTTP/1.1 404 Not Found");

правда я не совсем уверен, что делаю всё верно.

Ещё, на форуме punbb предусмотрена своя страница ошибок, но при вводе неправильного адреса например такого
punbb.info/forum/post2064.html
от сервера мы получаем заголовок

HTTP/1.1 200 OK
Server: nginx/1.9.5
Date: Fri, 22 Jan 2016 16:38:51 GMT
Content-Type: text/html; charset=utf-8

а на самом деле заголовок должен быть HTTP/1.1 404 Not Found

А если мы в файл ошибок в начале поставим заголовок HTTP/1.1 404 Not Found то при проверке получаем

HTTP/1.1 404 Not Found
Server: nginx/1.8.0
Date: Fri, 22 Jan 2016 16:46:33 GMT

Значит все сделано верно, так я понимаю.

3

Re: Как сделать свою страницу ошибки 404 на форуме

При переходе по приведенной ссылке
punbb.info/forum/post2064.html
мы и получим страницу с ошибкой и сообщением:

Неверный запрос. Ссылка, по которой вы пришли, неверна или устарела.

а так же код (в исходнике html страницы):

<meta name="ROBOTS" content="NOINDEX, FOLLOW" />

это означает, что индексация запрещена, но роботу разрешено индексировать ссылки на странице.

А вот код от сервера, как вы подметили, отдает 200

Код статуса HTTP: "200 OK"
Время ответа сервера: 50мс
Кодировка: UTF-8(unicode-1-1-utf-8, UTF8)
Размер страницы: 10.95Кб

Решается это так:(раз уж тема Моды)
В файл функций include/functions.php
Ищем хук:
($hook = get_hook('fn_message_pre_header_load')) ? eval($hook) : null;
И над ним вешаем:

header("HTTP/1.1 404 Not Found");

Вид страницы остается прежним как все и было, но ответ будет:

Код статуса HTTP: "404 Not Found"  ?
Время ответа сервера: 44мс
Кодировка: UTF-8(unicode-1-1-utf-8, UTF8)
Размер страницы: 10.95Кб

Если сделать маленькое расширение, то вставить в него нужно такой код:

  <hook id="fn_message_pre_header_load"><![CDATA[

    header("HTTP/1.1 404 Not Found");

  ]]></hook>

Вот в принципе и все. Можно как с модом, так и без. ))

4

Re: Как сделать свою страницу ошибки 404 на форуме

PunBB wrote:

Чтобы сделать свою страницу ошибки 404 для форума PunBB, вначале создадим пустую страницу с именем 404.php и разместим ее в корне форума.

PunBB wrote:

Далее открываем файл .htaccess и добавляем где нибудь в конце

Здравствуйте! Все сделал по инструкции, но оно не перекидывает на эту страницу ошибки. Если перейти на саму страницу 404.php, то она открывается. Скорее всего у меня какие то проблемы с файлом htaccess. Есть какие то другие решения этой проблемы.  PunBB_INFO_ICQ/sad

Страница ошибки очень нужна, это помогает посетителю понять, что произошло и возможно удержит на форуме.

$matches[1]

У вас на форуме же работает. Как вы это сделали, подскажите плиз  PunBB_INFO_ICQ/help

5

Re: Как сделать свою страницу ошибки 404 на форуме

MIRAX wrote:

Все сделал по инструкции, но оно не перекидывает на эту страницу ошибки. Если перейти на саму страницу 404.php, то она открывается. Скорее всего у меня какие то проблемы с файлом htaccess.

могу добавить опцию в расширение Pan SEO. Только вам прежде нужно будет создать эту страницу ошибки и в настройках СЕО Оптимизатора указать к ней путь.

$matches[1]

Обновил расширение, добавил там такую функцию. Но у вас на форуме вы должны задействовать .htaccess.

Если его имя как .htaccess.dict то переименуйте просто  в .htaccess

Скачать в теме расширения Pan SEO.