Как изменить дизайн страниц 403 и 404?

Главные вкладки

Аватар пользователя Zaggi Zaggi 4 апреля 2009 в 17:58

Возник вопрос, как изменить дизайн страниц 403 и 404. Сделал html-страницу, а как сделать так, чтобы она появлялась вместо стандартных страниц?
В админке есть функция, позволяющая поставить node-страницу на эти ошибки. Но мне надо полностью другую страницу поставить, то есть чтоб не было ни шапки, ни чего из общего дизайна.

И еще вопрос, как сделать так, чтобы неавторизованные посетители (гости) при заходе на сайт видели опять же отдельную (от общего дизайна) страницу?

Комментарии

Аватар пользователя Zaggi Zaggi 4 апреля 2009 в 20:48

"alisa" wrote:
.htaccess

Туда я полез первым делом.
Но там только строчка
# Make Drupal handle any 404 errors. ErrorDocument 404 /index.php
Она вроде как выбирает страницу для 404? А как поменять 403?

Аватар пользователя Zaggi Zaggi 4 апреля 2009 в 23:32

"ankheg" wrote:
Вот на этой странице админки есть что-то похожее - admin/settings/error-reporting

Это не то. Я писал про это в первом посте
"Zaggi" wrote:

В админке есть функция, позволяющая поставить node-страницу на эти ошибки. Но мне надо полностью другую страницу поставить, то есть чтоб не было ни шапки, ни чего из общего дизайна.

Аватар пользователя ankheg ankheg 5 апреля 2009 в 0:13

"Zaggi" wrote:
Я писал про это в первом посте

О, сорри.

Если работает

ErrorDocument 404 /custom-404.php

то наверное будет работать и

ErrorDocument 403 /custom-403.php

А с главной можно сделать так: создать ноду, запрещенную для просмотра гостями. И на admin/settings/site-information прописать в качестве главной эту ноду. Тогда главная будет отдавать 403 гостям.

Аватар пользователя ankheg ankheg 5 апреля 2009 в 0:17

Если ErrorDocument 403 /custom-403.php не работает, то как вариант можно попробовать прописать на admin/settings/error-reporting адрес custom-403.php

А .htaccess добавить строчку выше RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] примерно такую RewriteRule ^(custom-403.php)$ custom-403.php [L,QSA]

Аватар пользователя Ainur Ainur 5 апреля 2009 в 1:39

"Zaggi" wrote:
там другой вопрос рассматривается

Он к Вам самым прямым образом относится. Вы 404 страницу друпала на свою пытаетесь заменить, а других путей это сделать нет.
Нужно идти по моей ссылке, и пытаться понять как это сделать самому.

Аватар пользователя Zaggi Zaggi 5 апреля 2009 в 1:49

мне бы в первую очередь 403 поменять, а не 404.

ходил по ссылке. Там описывается, как подключить 404 к gif|jpe?g|png|s?html|css|js|cgi файлам. но страницу об ошибке там никто не подменяет.

странно, почему стандартные директивы ErrorDocument в .htaccess у друпала почему то игнорируются (хотя ошибку 500 удалось поменять таким образом)

Аватар пользователя Zaggi Zaggi 5 апреля 2009 в 15:37

Вобщем проблема решена своими усилиями.

Итак:

  • Ставим модуль customerror Он позволяет создавать страницы ошибок (шаблонные, типа node), с помощью html тегов, но разрешает так же и php-внедрение.
  • В админке, на странице http://itmo.specc.ru/?q=admin/settings/error-reporting ставим значения "customerror/403" и "customerror/404"
  • В настройках модуля, под полями разметки страниц ставим галочку Allow PHP code to be executed for 403
  • В полях для каждой страницы пишем php-код переадресации:
    <?php
    header
    ('Location:http://Ваша страница');
    exit();
    ?>

Если у вас стоит модуль на визуальный редактор, то при вводе кода, переключитесь на обычный.

В принципе можно обойтись и без модуля customerror, создав страницу, как и задумано в друпале,
и внедрив в нее тот же пхп код переадресации. В этом случае надо предварительно активировать модуль PHP filter.

Аватар пользователя Вадыч Вадыч 5 апреля 2009 в 11:02

"Zaggi" wrote:
В админке есть функция, позволяющая поставить node-страницу на эти ошибки. Но мне надо полностью другую страницу поставить, то есть чтоб не было ни шапки, ни чего из общего дизайна.

После того, как поставите page-node-<номер ноды>.tpl.php будет страница для вашей ошибки. Переопределяйте его как хотите.
Вариант 2.
Создать тип материала, например - errorpage. После этого создаете ноды этого типа и присваиваете их соответствующим ошибкам.
После этого page-node-errorpage.tpl.php будет отвечать за вывод всех страниц ошибок. В нем творите, что хотите Smile

Аватар пользователя Andrew Connect@drupal.org Andrew Connect@... 10 мая 2010 в 15:46

Вадыч wrote:
После того, как поставите page-node-<номер ноды>.tpl.php будет страница для вашей ошибки. Переопределяйте его как хотите.
Вариант 2.
Создать тип материала, например - errorpage. После этого создаете ноды этого типа и присваиваете их соответствующим ошибкам.
После этого page-node-errorpage.tpl.php будет отвечать за вывод всех страниц ошибок. В нем творите, что хотите :)

Первый вариант осуществился с первой попытки. Спасибо, Вадыч, за конструктивную подсказку!
А со вторым вариантом возникли проблемы: не смотря на полное изменение содержимого page-node-errorpage.tpl.php, при отображении страницы ошибки 404 с использованием этого шаблона, в дизайн примешивались элементы оформления основного дизайна (шаблона).
Если будет возможность и желание, прокомментируйте, пожалуйста, с чем это может быть связано?
Спасибо.
С уважением

Аватар пользователя ankheg ankheg 5 апреля 2009 в 17:52

"Вадыч" wrote:
После того, как поставите page-node-<номер ноды>.tpl.php будет страница для вашей ошибки. Переопределяйте его как хотите.

Вот это здорово.

Аватар пользователя Zaggi Zaggi 5 апреля 2009 в 22:01

"Ainur" wrote:
Проблема в том, что при вызове 403 и 404 через http://drupal.org/project/customerror происходит загрузка друпала.

Вы имеете ввиду ошибку
mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary. ?

Похоже что да. Спустя день сайт упал от превышения внутренних редиректов. Странно, в описании customerror ничего про mod_rewrite не было написано.

И как теперь его поднять?
Пробовал увеличить лимит через RewriteOptions MaxRedirects, но ничего не вышло.

Аватар пользователя Anodonta Anodonta 23 мая 2009 в 20:42

Я так и не увидел как можно сделать 404 страницу просто html страницей без привязки к Друпалу.
Конкретно мне надо просто 404 страница на html, т.к. у меня сайт из 3-х отдельных разделов:
- phpbb
- фотогаллерея
- Друпал
Пока не было Друпала, на 404 всё отправлялись нормально (путь к 404 прописывал в хостинг-панели).
Теперь Друпал "подминает под себя" 404 и "захватывает" её, т.е. при этой ошибке срабатывает вывод 404 страницы Друпалом.
Подскажите, как полностью отключить вывод 404 Друпалом?

Аватар пользователя Anodonta Anodonta 25 мая 2009 в 16:36

"<a href="mailto:vadbars@drupal.org">vadbars@drupal.org</a>" wrote:
ErrorDocument 404 /index.php

Вот вместо index.php пытался другое вставить с абсолютным и относительным путём. Не сработало Sad
И, вообще, всячески над этим файлом и конкретно этим местом старался, но, пока, безрезультатно.
Кеш чистил (для советчиков почистить кеш :)).
Приведите, пожалуйста, если можно, конкретный пример. Спасибо!

Аватар пользователя PanDa777 PanDa777 5 июня 2009 в 11:52

Ежели у вас настроено CleanUrl — то отключать вывод 404 страницы через Drupal нельзя (ИМХО).

Варианты:

  1. Чтобы отключить обработку Drupalом: отключить CleanUrls и правило для Rewrite, ErrorDocument в .htaccess (при обращении по адресу example.com/page/access/denied происходит с помощью Mod_Rewrite вызов example.com/index.php?q=page/access/denied, и поэтому директивы в .htaccess не работают).
  2. Как предложил Zaggi — но вместо Redirect — просто print полный_текст_страницы_в_html, как в функции ниже. Как вариант — вместо print readfile.
  3. Включить customerror, и переопределить theme_customerror (как это делать идеологически правильно --- см http://drupal.org/node/441088, в частности — Example 3) на print полный_текст_страницы_в_html. Пример:
    function subthemename_customerror($code) {
      switch(code) {
        case 403:
          print("<html><head><title>Access denied</title></head><body><p>Access denied</p></body></html>");
          exit(0);
          break;
        case 404:
          print("<html><head><title>Not found</title></head><body><p>Not found</p></body></html>");
          exit(0);
          break;
      }
    }

    Вроде должно работать.

  4. Идеологически совсем неправильно — drupal_access_denied в common.inc и drupal_not_found там же.
Аватар пользователя lopata24 lopata24 11 февраля 2010 в 11:55

вопрос следующий:
в поиск попадают страницы 403 и 404, которые я создал, как тип материала error

Как исключить эти 2 страницы из поиска? Если убирать галочку "опубликовано", то гость не видит страниц 404 и 403, которые я ему пытаюсь показать...

Аватар пользователя PanDa777 PanDa777 14 февраля 2010 в 17:23

А как они туда попадают? Этого, вообще-то, не должно быть.

Все страницы с закрытым доступом (403) перечисляются в robots.txt. А 404ых вообще не должно быть.

Аватар пользователя Anodonta Anodonta 12 февраля 2010 в 15:06

У меня так и не получилось сделать "свою" страницу 404.
Варианты для нормального человека:
1. 404 - показывает Drupal.
2. Вместо 404 настроить редирект на главную (или нужную) страницу в файле ".htaccess" хостинга.

Аватар пользователя lopata24 lopata24 14 февраля 2010 в 19:30

PanDa777
вы не правильно меня поняли, или я выразился неудачно
я создал тип контента error и 2 ноды 403 и 404
в настройках admin/settings/error-reporting выставляю их соответственно
в теле этих нод такой примерно текст "Вы можете воспользоваться поиском, если искали что-то конкретное или зайти на главную страницу нашего сайта"

и в поиске, например, по слову "поиск" или слову "конкретное", соответственно вылазят эти 2 страницы вместе с остальными нодами.

Сформулирую иначе, как исключить из поиска определенный тип материала или 2 ноды?

Аватар пользователя egorovanton egorovanton 20 февраля 2010 в 21:04

А не вариант ли создать шаблоны для статических страниц с соответствием номера ноды к номеру в шаблоне типа page-node-1.tpl.php и затемизировать не забыв указать в robots.txt?

Аватар пользователя lopata24 lopata24 21 февраля 2010 в 13:41

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

Аватар пользователя PanDa777 PanDa777 2 марта 2010 в 22:19

Любой из способов, описанный в моём сообщении от 05/06/2009 - 10:52, подходит. Поиск не будет индексировать эти страницы.