Как настроить Apache для использования пользовательских страниц ошибок в Ubuntu 14.04
Введение
Apache — самый популярный веб-сервер в мире. Он хорошо поддерживается, многофункционален и гибок. При разработке веб-страниц часто полезно настроить каждую часть контента, которую увидят ваши пользователи. Это включает в себя страницы ошибок, когда они запрашивают контент, который недоступен. В этом руководстве мы покажем, как настроить Apache для использования пользовательских страниц ошибок в Ubuntu 14.04.
Предпосылки
Чтобы начать работу с этим руководством, вам понадобится пользователь без полномочий root с привилегиями sudo
. Вы можете настроить пользователя этого типа, следуя нашему руководству.
Создание собственных страниц ошибок
Мы создадим несколько пользовательских страниц ошибок для демонстрационных целей, но ваши пользовательские страницы, очевидно, будут отличаться.
Мы поместим наши пользовательские страницы ошибок в каталог /var/www/html
, где установка Apache Ubuntu устанавливает корневой каталог документа по умолчанию. Мы создадим страницу для ошибок 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 для каждой ошибки со страницей, которую мы хотим обслуживать, когда она возникает.
Для нашего примера отображение ошибок будет выглядеть так:
<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>
Одного этого изменения достаточно для обслуживания пользовательских страниц ошибок при возникновении указанных ошибок.
Однако мы добавим дополнительный набор конфигураций, чтобы наши страницы ошибок не могли запрашиваться клиентами напрямую. Это может предотвратить некоторые странные ситуации, когда текст страницы ссылается на ошибку, но статус http равен «200» (указывает на успешный запрос).
Отвечать кодом 404 при прямом запросе страниц с ошибками
Чтобы реализовать это поведение, нам нужно добавить блок Files
для каждой из наших пользовательских страниц. Внутри мы можем проверить, установлена ли переменная окружения REDIRECT_STATUS
. Это должно быть установлено только тогда, когда директива ErrorDocument
обрабатывает запрос. Если переменная окружения пуста, мы выдадим ошибку 404:
<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
внизу виртуального хоста. Отправьте запросы на /proxytest
на порт 9000 на локальном компьютере (где не запущена служба):
<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
Перезапуск Apache и тестирование ваших страниц
Проверьте файл конфигурации на наличие синтаксических ошибок, набрав:
- sudo apache2ctl configtest
Решайте любые проблемы, о которых сообщается. Когда ваши файлы не содержат синтаксических ошибок, перезапустите Apache, набрав:
- sudo service apache2 restart
Теперь, когда вы переходите на домен или IP-адрес вашего сервера и запрашиваете несуществующий файл, вы должны увидеть страницу 404, которую мы создали:
http://server_domain_or_IP/thiswillerror
Когда вы перейдете в место, которое мы настроили для фиктивного прокси-пропуска, мы получим ошибку «503 сервис недоступен» с нашей пользовательской страницей уровня 500:
http://server_domain_or_IP/proxytest
Теперь вы можете вернуться и удалить фальшивую строку доступа к прокси-серверу из конфигурации Apache. Вы можете отключить прокси-модули, если вам не нужно их использовать где-либо еще:
- sudo a2dismod proxy
- sudo a2dismod proxy_http
Перезапустите сервер еще раз, чтобы применить эти изменения:
- sudo service apache2 restart
Заключение
Теперь вы должны обслуживать настраиваемые страницы ошибок для своего сайта. Это простой способ персонализировать работу пользователей, даже если у них возникают проблемы. Одним из предложений для этих страниц является размещение ссылок на места, где они могут получить помощь или дополнительную информацию. Если вы сделаете это, убедитесь, что адресаты ссылок доступны даже при возникновении соответствующих ошибок.