Настройка пользовательских страниц ошибок Apache в Ubuntu 14.04

Apache – самый популярный в мире веб-сервер; многофункциональный и гибкий, он постоянно поддерживается командой специалистов.

При проектировании веб-страниц часто возникает необходимость настроить каждую из них в индивидуальном порядке. Это касается и страниц ошибок, которые появляются в случае, если запрашиваемый контент по какой-либо причине недоступен. В этом руководстве показано, как настроить Apache для отображения пользовательских страниц ошибок в системе Ubuntu 14.04.

Требования

Для выполнения данного руководства нужен пользователь с привилегиями sudo. Чтобы настроить такую учётную запись пользователя, обратитесь к этому руководству. Кроме того, нужно предварительно установить Apache; подробные инструкции по установке можно найти здесь.

Создание пользовательской страницы ошибок

Сначала нужно создать пользовательские страницы ошибок.

Примечание: Для тестирования можно использовать следующий код без изменений. Чтобы создать свою страницу ошибок, просто замените текст в echo в приведённом ниже коде.

Страницы ошибок будут храниться в каталоге /var/www/html – стандартном каталоге document root веб-сервера Apache. Для примера создайте страницу ошибки 404 (по имени custom_404.html) и общую страницу для ошибок 500 (custom_50x.html).

echo "<h1 style='color:red'>Error 404: Not found :-(</h1>" | sudo tee /var/www/html/custom_404.html
echo "<p>I have no idea where that file is, sorry.  Are you sure you typed in the correct URL?</p>" | sudo tee -a /var/www/html/custom_404.html
echo "<h1>Oops! Something went wrong...</h1>" | sudo tee /var/www/html/custom_50x.html
echo "<p>We seem to be having some technical difficulties. Hang tight.</p>" | sudo tee -a /var/www/html/custom_50x.html

Итак, теперь на сервере есть две страницы ошибок.

Настройка Apache для отображения пользовательских страниц ошибок

Теперь нужно настроить Apache для поддержки только что созданных страниц в случае возникновения соответствующей ошибки. В каталоге /etc/apache2/sites-enabled откройте файл виртуального хоста. В руководстве используется стандартный файл хоста 000-default.conf, но вы можете работать с пользовательскими хостами.

sudo nano /etc/apache2/sites-enabled/000-default.conf

Направьте Apache на соответствующие страницы ошибок.

Для того чтобы связать каждый тип ошибки со специальной страницей, используйте директиву ErrorDocument. Это можно сделать в файле хоста. В целом, нужно просто указать код состояния HTTP для каждой страницы, и тогда страница появится на экране в случае возникновения указанной ошибки.

В данном случае настройки будут выглядеть так:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ErrorDocument 404 /custom_404.html
ErrorDocument 500 /custom_50x.html
ErrorDocument 502 /custom_50x.html
ErrorDocument 503 /custom_50x.html
ErrorDocument 504 /custom_50x.html
</VirtualHost>

Этого кода достаточно для настройки обслуживания страниц ошибок.

Однако рекомендуется добавить ещё один блок конфигураций, чтобы клиенты не могли запрашивать страницы ошибок напрямую. Это предотвратит путаницу (например, запрошенная напрямую страница ошибки будет сообщать пользователю об ошибке, даже если код состояния – 200 (Success)).

Чтобы настроить такое поведение веб-сервера, нужно добавить блок Files для каждой пользовательской страницы ошибок. Также нужно проверить, установлена ли переменная окружения REDIRECT_STATUS; она должна быть установлена, только если директива ErrorDocument обрабатывает запрос. Если переменная окружения пуста, сервер будет обслуживать страницу 404:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
. . .
ErrorDocument 404 /custom_404.html
ErrorDocument 500 /custom_50x.html
ErrorDocument 502 /custom_50x.html
ErrorDocument 503 /custom_50x.html
ErrorDocument 504 /custom_50x.html
<Files "custom_404.html">
<If "-z %{ENV:REDIRECT_STATUS}">
RedirectMatch 404 ^/custom_404.html$
</If>
</Files>
<Files "custom_50x.html">
<If "-z %{ENV:REDIRECT_STATUS}">
RedirectMatch 404 ^/custom_50x.html$
</If>
</Files>
</VirtualHost>

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

Тестирование страницы ошибок 500

Проверить работу страницы ошибок 404 очень просто: достаточно запросить любой несуществующий контент. Но чтобы протестировать страниц ошибок 500, нужно создать фиктивную директиву ProxyPass.

Добавьте директиву ProxyPass в конец конфигурационного файла. Отправьте запросы для /proxytest на порт 9000 на локальной машине (на этом порте не запущено ни одного сервиса):

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
. . .
ErrorDocument 404 /custom_404.html
ErrorDocument 500 /custom_50x.html
ErrorDocument 502 /custom_50x.html
ErrorDocument 503 /custom_50x.html
ErrorDocument 504 /custom_50x.html
<Files "custom_404.html">
<If "-z %{ENV:REDIRECT_STATUS}">
RedirectMatch 404 ^/custom_404.html$
</If>
</Files>
<Files "custom_50x.html">
<If "-z %{ENV:REDIRECT_STATUS}">
RedirectMatch 404 ^/custom_50x.html$
</If>
</Files>
ProxyPass /proxytest "http://localhost:9000"
</VirtualHost>

Сохраните и закройте файл.

Затем включите модули mod_proxy и mod_proxy_http:

sudo a2enmod proxy
sudo a2enmod proxy_http

Тестирование страниц ошибок

Проверьте конфигурационный файл на наличие ошибок:

sudo apache2ctl configtest

Если команда обнаружила любые ошибки, исправьте их. Затем перезапустите Apache:

sudo service apache2 restart

Теперь откройте домен или IP-адрес сервера и запросите несуществующий контент, чтобы проверить работу страницы 404:

http://server_domain_or_IP/thiswillerror

На экране должна появиться страница 404:

Error 404: Not found :-(
I have no idea where that file is, sorry.  Are you sure you typed in the correct URL?

Откройте фиктивный proxypass, чтобы проверить работу страницы 500 (на экране должен появиться код состояния 503 service unavailable):

http://server_domain_or_IP/proxytest

Если всё было выполнено верно, на экране появится:

Oops! Something went wrong...
We seem to be having some technical difficulties. Hang tight.

После тестирования удалите фиктивную директиву из конфигураций Apache. Также нужно отключить модули proxy:

sudo a2dismod proxy
sudo a2dismod proxy_http

В завершение перезапустите веб-сервер:

sudo service apache2 restart

Заключение

Итак, теперь на сайте есть уникальные страницы ошибок. Пользовательские страницы ошибок – это отличный способ помочь посетителям понять, в чём дело, предоставить им всю необходимую информацию об ошибке и полезные ссылки (не забудьте убедиться, что ссылки работают даже в случае возникновения ошибок).

Tags: ,

Добавить комментарий