В этой статье я попытаюсь объяснить, как формируются ошибочные запросы на сервере Apache, как их обрабатывать и как сделать собственную страницу ошибки сервера, оформленную в едином стиле с сайтом.
Для начала немного теории. Всё, что написано ниже, справедливо для сервера Apache (их в интернете подавляющее большинство). Когда вы набираете в строке несуществующий адрес или переходите по «битой ссылке», на страничке высвечивается жирными буквами сообщение «Not found» — «документ не найден», хотя вкупе с устрашающим видом надписи может быть переведено неопытным пользователем как «пошёл вон» :). Кстати, пользователи IE возможно и не видели эту страничку ни разу, поскольку он – IE – формирует в этом случае своё сообщение с «дружественным» содержанием, типа «обновите страничку, позвоните другу, который вам эту ссылочку дал…», но это делу не помогает. Иногда IE может и показать оригинальное сообщение сервера, но только в том случае, если оно больше определённого размера (по умолчанию 512 байт). В общем, итог всегда один – страницы нет и посетитель недоволен. А нам, администраторам сайтов, надо заботиться, чтобы эта потеря была менее болезненной.
Давайте разберёмся, что происходит на сервере при запросе правильных/ошибочных URL.
При GET-запросе URL (тот, что в адресной строке браузера) передаётся серверу, а на выходе клиенту выдаётся набор заголовков с последующим полем данных. Заголовки никогда не выводятся пользователю напрямую и содержат много служебной информации, которая может быть обработан CGI-скриптами (а это нам скоро и понадобится). Среди этих заголовков всегда есть так называемые коды ответов. Если не вдаваться в подробности, то они передаются примерно так:
GET /index.htm HTTP/1.1 404 Not Found
Первая строка говорит о том, что пользователем (точнее, браузером пользователя) был передан запрос на страницу index.htm, а вторая строка сообщает ему, что такой документ не найден, после чего следует блок данных — HTML-страница с сообщением об ошибке. Если URL правильный, всё происходит так, как и должно быть – передаётся код ответа 200 и запрошенный файл. Код ответа 200 передаётся всегда при удачном запросе, но мы его никогда не видим. Как уже говорилось, при неудачном запросе сервер сгенерирует код ответа в диапазоне 400…499 и мы увидим стандартное сообщение об ошибке, которое, огорчает пользователя и портит репутацию сайта. Вообще говоря, у хорошего веб-мастера таких ошибок на сайте быть не должно, но не его вина, что например пользователь вдруг сказал «принеси то, не знаю что».
Перейдём от рассуждений к делу. У сервера Apache имеется стандартная директива обработки ошибок ErrorDocument, которая сопоставляет коду ошибки адрес документа, который будет показан пользователю. Обычно перенаправление устанавливают на документ, содержащий логотип сайта и краткую информацию «что делать». Увидев такую страницу вместо стандартного сообщения на fatal.ru (два года назад, когда начал заниматься веб-программированием), я долго был под впечатлением! Откуда они знают, что у меня такой страницы нет? 
ErrorDocument 400 400.html
В случае ошибки 400 пользователю выдаётся файл 400.html – всё очень просто и удобно. Сразу же отметим, что можно использовать четыре варианта передачи сообщения об ошибке:
ErrorDocument 500 http://foo.example.com/cgi-bin/tester ErrorDocument 404 /cgi-bin/bad_urls.pl ErrorDocument 401 /subscription_info.html ErrorDocument 403 "Доступ запрещён
В последнем случае вместо файла пользователь увидит на экране сообщение, следующее за одиночной кавычкой (закрывать кавычку не следует!).
Прописать директиву можно в двух местах – конфигурационном файле Apache httpd.conf или в файле управления доступом к директориям .htaccess. В первом случае вы должны иметь доступ к httpd.conf, а для этого вы должны являться администратором сервера (и, скорее всего, вам эта статья не понадобилась бы 
Короче, создаём в корне своего сайта файлик .htaccess и записываем в него строчку «ErrorDocument 400 400.html«, при условии, что файл 400.html уже существует.
Дальше начинается самое интересное, а именно – как будет выглядеть эта страничка. Создать страничку можно как минимум тремя способами.
- Самый простой вариант – набросать в HTML-редакторе или «Блокноте» обычную страничку без графического оформления и сохранить её под нужным именем.
- Вариант посложнее – можно добавить в этот HTML-файл директивы SSI, которые, к примеру, будут показывать URL, адрес, с которого пришёл пользователь, время, подключить внешние файлы и т.д.
- Но согласитесь, первые два варианта – это примитив, не достойный настоящего веб-мастера. Опытные программисты пишут страницы ошибок на PHP. В этом есть одно достоинство – мы получаем доступ к переменным окружения, что даёт возможность лучше анализировать ошибочную ситуацию, выводить больше информации пользователю, вести лог ошибок в файле или базе данных, а не тупо выводить Not found и посылать бедного юзера на главную страницу.
Как вы уже догадались, мы будем рассматривать именно третий вариант. Начнём с простого – как PHP-скрипт получит код ошибки? Естественно, через параметр. Например, вот так:
error.php?400
В самом скрипте код ошибки после знака вопроса будет доступен в переменной $argv[0]. Теперь проверим скрипт (он должен вывести код ошибки, указанный после «?»):
<?php
echo $argv[0];
?>
Можно было бы передать параметр в классическом виде error.php?id=400, но так проще и безопаснее — этот скрипт принимает только одну переменную, зачем лишние лазейки? Сразу же обезопасим скрипт от ввода неверных данных: приведём код к целому типу и сделаем присвоение кода 404 по умолчанию, если скрипт был вызван без параметров. Приучайте себя к написанию безопасного кода! Теперь даже если ввести error.php?404abc или даже error.php?abc – значение переменной $id (она введена для читабельности) всё равно будет равно 404.
<?php
// проверяем переменную
$id = $argv[0];
$id = abs(intval($id));
if (!$id) $id = 404;
echo $id;
?>
Следующее, что мы сделаем – сопоставим коду русскоязычное описание. Это можно сделать при помощи операторов switch…case, но опытный программист сделает это более аккуратно и красиво – через ассоциативный массив, в котором ключ – это код ошибки, а значение – это её описание. Сделать такой массив очень просто, да и дополнять его легче, чем списки switch…case. Рекомендую начинающим программистам всегда использовать ассоциативный массив вместо switch…case, если в списке больше трёх позиций – выигрыш в скорости, размере кода и понятности. Список кодов ошибок можно найти на официальном сайте W3C (организация по веб-стандартам) http://www.w3.org/Protocols/HTTP/HTRESP.html или в любой книге по веб-программированию. Я сделал так:
<?php
// проверяем переменную
$id = $argv[0];
$id = abs(intval($id));
if (!$id) $id = 404;
// ассоциативный массив кодов и описаний
$a[401] = "Требуется авторизация";
$a[403] = "Пользователь не прошел аутентификацию, доступ запрещен";
$a[404] = "Документ не найден";
$a[500] = "Внутренняя ошибка сервера";
$a[400] = "Неправильный запрос";
// выводим код и описание
echo "$id $a[$id]";
?>
В результате выполнения этого кода пользователь увидит сообщение «404 Документ не найден» (по-крайней мере, так вывелось у меня, вы можете смоделировать другую ошибку). В принципе, тот же результат можно было получить при использовании первого способа, но разве я сказал, что мы на этом остановимся?
Кстати, пока не забыл. Ошибки с кодами 500…599 встречаются обычно, когда ошибку совершает сценарий, расположенный на вашем сервере. Некоторые интерпретаторы сценариев, например PHP, никогда не допускают такой ошибки. Если в вашем PHP-скрипте есть ошибка, интерпретатор сам выведет ошибочное сообщение с указанием её происхождения, а не просто «Ошибка». Со стороны сервера это будет выглядеть как нормальный ответ клиенту, поэтому ошибка 500 при использовании PHP у вас практически никогда не возникнет. В отличие от него, Perl генерирует ошибку 500 и записывает сообщение о ней в лог сервера. Иди потом, разбери его – сложность отладки Perl-скриптов очень высокая. Это была одна из причин, по которой мне в своё время посоветовали перейти с Perl на PHP, что я и сделал, чего и вам желаю.
Вернёмся к написанию скрипта. Основная часть – обработка кода ошибки – уже готова, займёмся «довесками». Для начала выведем поясняющее сообщение с ошибочным URL:
echo "Запрошенный Вами URL: <b>http://$SERVER_NAME$REQUEST_URI</b><br /> ";
Здесь включены две глобальные переменные $SERVER_NAME и $REQUEST_URI. Первая содержит имя сервера, вторая – URI (не путать с URL), который был запрошен. Выведем ещё на всякий случай IP-адрес, название браузера и текущее время на сервере.
$time = date("d.m.Y H:i:s");
Ваш IP: <b>$REMOTE_ADDR</b><br />
Ваш браузер: <b>$HTTP_USER_AGENT</b><br />
Текущее время сервера: <b>$time</b><br />
Согласитесь, это уже намного интересней. Если пользователь пришёл на ошибку по ссылке с другой страницы, покажем ему и этот URL этой страницы (переменная $HTTP_REFERER). Дополнительно можно показать реальный IP-адрес клиента, если он работает через прокси (переменная $HTTP_X_FORWARDER_FOR).
if ($HTTP_REFERER) $body .= "Вы пришли со страницы: <b>$HTTP_REFERER</b><br />n";
if ($HTTP_X_FORWARDER_FOR) $body .= "Ваш IP через прокси: <b>$HTTP_X_FORWARDER_FOR</b><br />n";
Ну и в завершение в самом низу «подпись» сервера (не на всех хостингах она работает корректно, потому что это чисто «серверная» переменная):
$_SERVER['SERVER_SIGNATURE']
Думаю, этой информации будет достаточно, для того чтобы пользователь не почувствовал, что пришёл на «последнюю страницу интернета». Но есть ещё одна деталь, которую не упустит внимательный программист. Вспомните, откуда вы чаще всего попадаете на «ошибочные страницы»? Ну конечно из поисковых систем, в которых информация быстро устаревает. В подавляющем большинстве случаев мелкие проекты, типа FoxWeb переезжают с сервера на сервер, а потом на новом сервере сайт модернизируется, а старый остаётся на старом месте. Ну, в общем вы меня поняли :). У меня было так: первый сайт был открыт на kiiut.fatal.ru, потом всё его содержимое было скопировано на foxweb.net.ru. В поисковых системах хранятся ссылки на оба сайта. Через какое-то время старое содержимое на foxweb было удалено, а ссылки на него остались в поисковиках. Если заменить адрес сервера в ошибочной ссылке, то она вполне будет работать. Поясню на примере.
Предположим, человек нашёл в поисковой системе что-то вроде http://foxweb.net.ru/catalog/sbornik_fox1.html. У нашего сервера такой ссылки нет, но она должна была остаться на старом сервере со старым содержимым. Тогда предложим пользователю перейти по адресу http://kiiut.fatal.ru/catalog/sbornik_fox1.html. Опишем эту особенность в программе:
Возможно интересующую Вас информацию можно найти по старому адресу:<br />
<a href="http://kiiut.fatal.ru$REQUEST_URI" target="_blank"><b>http://kiiut.fatal.ru$REQUEST_URI</b></a><br />
Даже если у вас не было такой ситуации, как у меня, возможно вы переписывали скрипты и адреса поменялись. Например, http://someserver.ru/catalog/ заменим на http://someserver.ru/?catalog или http://someserver.ru/cgi-bin/catalog.cgi. Надеюсь, общий смысл вам понятен, главное знать, что чем заменять.
Есть ещё одна особенность применения ошибочных страниц. Если несуществующая страница вызвана через вложенные директории, а заменяющая страница (наш скрипт) лежит в корне, то картинки на ней не будут отображены, а ссылки не будут работать. Почему? Это произойдёт в том случае, если вы используете на своём сайте относительные пути. Приведу пример:
http://someserver.ru/dir1/dir2/dir3/ — ошибочный адрес.
http://someserver.ru/error.php?404 – заменяющая страница будет вызвана по ОШИБОЧНОМУ ПУТИ, так как будто она там и хранится! Тогда ссылки на ней типа «page1.html» будут реально приводить вас по адресу http://someserver.ru/dir1/dir2/dir3/page1.html что будет вызывать ещё большее количество ошибок. Излечиться от этого можно, используя абсолютные пути ссылок и картинок (с именем сервера) или ставить перед относительным путём знак «/«, что на большинстве серверов указывает на корневую директорию сайта. Заметьте, что знак «./» будет указывать на текущую директорию.
В заключении приведу полный текст скрипта. Он может использоваться как сам по себе (отдельная страничка), так и в качестве модуля основного движка (вызывается движком и вставляется в серединку шаблона, как это сделано на моём сайте). Для серьёзных профессиональных проектов может оказаться полезным записывать информацию об ошибках в базу данных.
Фрагмент файла http.conf или .htaccess для правильной обработки ошибок:
ErrorDocument 400 /error.php?400
ErrorDocument 401 /error.php?401
ErrorDocument 403 /error.php?403
ErrorDocument 404 /error.php?404
ErrorDocument 500 /error.php?500
Текст скрипта error.php:
<?php
$id
= $argv[0];
$id = abs(intval($id));
if (!$id) $id = 404;
// ассоциативный массив кодов и описаний
$a[401] = "Требуется авторизация";
$a[403] = "Пользователь не прошел аутентификацию, доступ запрещен";
$a[404] = "Документ не найден";
$a[500] = "Внутренняя ошибка сервера";
$a[400] = "Неправильный запрос";
// определяем дату и время в стандартном формате
$time = date("d.m.Y H:i:s");
// эта переменная содержит тело сообщения
$body =<<<END
Запрошенный Вами URL: <b>http://$SERVER_NAME$REQUEST_URI</b><br />
Возможно интересующую Вас информацию можно найти по старому адресу:<br />
<a href="http://kiiut.fatal.ru$REQUEST_URI" target="_blank"><b>http://kiiut.fatal.ru$REQUEST_URI</b></a><br />
<br />
Ваш IP: <b>$REMOTE_ADDR</b><br />
Ваш браузер: <b>$HTTP_USER_AGENT</b><br />
Текущее время сервера: <b>$time</b><br />
END;
if ($HTTP_REFERER) $body .= "Вы пришли со страницы: <b>$HTTP_REFERER</b><br />n";
if ($HTTP_X_FORWARDER_FOR) $body .= "Ваш IP через прокси: <b>$HTTP_X_FORWARDER_FOR</b><br />n";
?>
<h1><i><?=$id?></i> <?=$a[$id]?></h1>
<p><?=$body?></p>
<?=$GLOBALS['SERVER_SIGNATURE']?>
Желаю всем удачного программирования и 200-го кода!
P.S. — Мой сайт ещё совсем зелёный, но там много интересного заходите в гости!

How to Install and Configure Apache for WordPress
Learn How to install and configure apache for WordPress. With this guide we will show you how to install and setup Apache for a WordPress installation.
How to Install and Configure Apache for WordPress

Install and Use Apache Tomcat on CentOS 7
Learn how to install and use Apache Tomcat on CentOS 7. Apache Tomcat is a Java Servlet container developed by Apache to which allows you to deploy Java servlets and JSPs. Apache Tomcat also functions as a web server, which is able to support small to medium-sized websites. This tutorial also covers how to install and use the Tomcat Web Admin Manager, which allows you to manage Tomcat and virtual…
Install and Use Apache Tomcat on CentOS 7

Enable CGI Scripts on Apache
Learn how to enable CGI scripts to run on the Apache web server. This tutorial includes step-by-step instructions for adding the necessary Apache configurations to allow CGI scripts to run, and how to set the correct permissions on the directory and CGI files.
Enable CGI Scripts on Apache

Use the ModSecurity Apache Module on a Cloud Server with Ubuntu 16.04
ModSecurity is a free web application firewall (WAF) which is a simple, powerful way to protect a server against web-based malware and hacking attempts. Learn how to install ModSecurity and the officially-recommended OWASP Core Rule Set (CRS) which will protect a server against malware and hacking in the form of SQL injection, session hijacking, cross-site scripting, Trojans, and many other forms…
Use the ModSecurity Apache Module on a Cloud Server with Ubuntu 16.04

Add and Manage Virtual Hosts on a Plesk Server
Learn how to add and manage domains as virtual hosts on a Cloud Server with Plesk. Virtual hosts allow you to host multiple separate websites on the same server, with a separate set of directories for each website.
Add and Manage Virtual Hosts on a Plesk Server
Here’s the relevant part of the .htaccess file:
AuthUserFile /var/www/mywebsite/.htpasswd
AuthGroupFile /dev/null
AuthName protected
AuthType Basic
Require valid-user
ErrorDocument 400 /var/www/errors/index.html
ErrorDocument 401 /var/www/errors/index.html
ErrorDocument 403 /var/www/errors/index.html
ErrorDocument 404 /var/www/errors/index.html
ErrorDocument 500 /var/www/errors/index.html
Docuement root is set to /var/www/mywebsite/web, it’s on of many vhosts. I can navigate to the index.html page.
All I’m seeing is the generic Apache 401 page, any thoughts.
EDIT: This is the error message in my browser:
Authorization Required
This server could not verify that you
are authorized to access the document
requested. Either you supplied the
wrong credentials (e.g., bad
password), or your browser doesn’t
understand how to supply the
credentials required.Additionally, a 401 Authorization
Required error was encountered while
trying to use an ErrorDocument to
handle the request. Apache/2.2.9
(Debian) PHP/5.2.6-1+lenny8 with
Suhosin-Patch Server at www.dirbe.com
Port 80
asked Dec 2, 2010 at 23:58
Parris VarneyParris Varney
11.3k12 gold badges47 silver badges76 bronze badges
Make sure that /var/www/errors is readable by the apache user and include this in your apache configuration:
<Directory /var/www/errors>
Order allow,deny
Allow from all
</Directory>
answered Dec 3, 2010 at 0:05
Sam ColesSam Coles
3,99323 silver badges19 bronze badges
7
ErrorDocument takes in a absolute URL path instead of a file path. So it should be:
ErrorDocument 404 /error/error.html
Assuming under your document root is a /error/error.html file.
answered Feb 19, 2018 at 15:15
2
This question (and answers and comments) helped me a bunch, thanks much!
I solved a slightly different way, and wanted to share. In this case, we needed to provide a custom 401 error document and the root path needed to be proxied to a backend app.
So, for example, http://example.com needed to serve content from http://internal-server:8080/. Also, http://example.com needed to be protected using Basic Auth with a custom 401 error document.
So, I created a directory named «error» in the DocumentRoot. Here’s the relevant lines from the vhost:
ErrorDocument 401 /error/error401.html
# Grant access to html files under /error
<Location "/error">
Options -Indexes
Order Deny,Allow
Allow from all
</Location>
# restrict proxy using basic auth
<Proxy *>
Require valid-user
AuthType basic
AuthName "Basic Auth"
AuthUserFile /etc/apache2/.htpasswd
</Proxy>
# Proxy everything except for /error
ProxyRequests Off
ProxyPass /error !
ProxyPass / http://internal:8080/
ProxyPassReverse / http://internal:8080/
answered Aug 30, 2011 at 15:56
UpgradingdaveUpgradingdave
12.9k10 gold badges62 silver badges72 bronze badges
1
Вступление
Apache — самый популярный веб-сервер в мире. Он хорошо поддерживается, многофункциональн и гибок. При разработке ваших веб-страниц часто бывает полезно настроить каждый фрагмент контента, который увидят ваши пользователи. Это включает страницы ошибок, когда они запрашивают контент, который недоступен. В этом руководстве мы покажем, как настроить Apache для использования пользовательских страниц ошибок в Ubuntu 14.04.
Предпосылки
Создание пользовательских страниц ошибок
Мы создадим несколько пользовательских страниц ошибок для демонстрационных целей, но ваши пользовательские страницы, очевидно, будут другими.
Мы разместим наши пользовательские страницы ошибок в каталоге + / var / www / html, где установка Ubuntu 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 [email protected]
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Одного этого изменения достаточно, чтобы обслуживать пользовательские страницы ошибок при возникновении указанных ошибок.
Однако мы добавим дополнительный набор конфигураций, чтобы клиенты не могли напрямую запрашивать наши страницы ошибок. Это может предотвратить некоторые странные ситуации, когда текст страницы ссылается на ошибку, но http-статус «200» (указывает на успешный запрос).
Ответьте 404, когда страницы ошибок запрашиваются напрямую
Чтобы реализовать это поведение, нам нужно добавить блок + 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
</VirtualHost>
Когда страницы ошибок запрашиваются непосредственно клиентами, возникает ошибка 404, поскольку не установлена правильная переменная среды.
Настроить тестирование на 500-уровневые ошибки
Мы можем легко выдать 404 ошибки, чтобы протестировать нашу конфигурацию, запросив несуществующее содержимое. Чтобы проверить ошибки уровня 500, нам нужно будет установить фиктивный проход прокси, чтобы мы могли гарантировать, что верные страницы будут возвращены.
Добавьте директиву + 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>
</VirtualHost>
Сохраните и закройте файл, когда вы закончите.
Теперь включите модули + mod_proxy + и + mod_proxy_http +, набрав:
sudo a2enmod proxy
sudo a2enmod proxy_http
Перезапуск Apache и тестирование ваших страниц
Проверьте ваш файл конфигурации на наличие синтаксических ошибок, набрав:
sudo apache2ctl configtest
Решать любые проблемы, о которых сообщается. Если ваши файлы не содержат синтаксических ошибок, перезапустите Apache, набрав:
sudo service apache2 restart
Теперь, когда вы переходите на домен или IP-адрес вашего сервера и запрашиваете несуществующий файл, вы должны увидеть страницу 404, которую мы настроили:
изображение: https: //assets.digitalocean.com/articles/nginx_custom_error_1404/custom_404.png [настраиваемый apache 404]
Когда вы перейдете в место, которое мы настроили для фиктивного пропуска, мы получим ошибку «503 услуга недоступна» с нашей пользовательской страницей на 500 уровней:
изображение: https: //assets.digitalocean.com/articles/nginx_custom_error_1404/custom_50x.png [пользовательский apache 50x]
Теперь вы можете вернуться и удалить поддельную строку пропуска прокси из вашей конфигурации Apache. Вы можете отключить прокси-модули, если вам не нужно их использовать где-либо еще:
sudo a2dismod proxy
sudo a2dismod proxy_http
Перезапустите сервер снова, чтобы применить эти изменения:
sudo service apache2 restart
Заключение
Теперь вы должны обслуживать пользовательские страницы ошибок для вашего сайта. Это простой способ персонализировать опыт ваших пользователей, даже если они испытывают проблемы. Одним из предложений для этих страниц является включение ссылок на места, куда они могут обратиться за помощью или дополнительной информацией. Если вы сделаете это, убедитесь, что ссылки назначения доступны даже при возникновении связанных ошибок.
I want to customise the 404 page of my Apache Webserver on Ubuntu to something other than the general:
Not Found
The requested URL /***** was not found on this server.
______________________________________________________
Apache/*.*.** (Ubuntu) Server at **** Port 80
How can this be accomplished?
Braiam
66.7k30 gold badges176 silver badges264 bronze badges
asked Jul 15, 2011 at 12:43
1
I found the answer myself.
You have to edit the file /etc/apache2/conf.d/localized-error-pages
sudoedit /etc/apache2/conf.d/localized-error-pages
You can enter plaintext or link to a script or html
Marco Ceppi
47.7k30 gold badges171 silver badges197 bronze badges
answered Jul 15, 2011 at 12:53
Amith KKAmith KK
13.3k13 gold badges66 silver badges121 bronze badges
<VirtualHost 192.168.0.1:80>
ServerAdmin admin@host.ru
ServerName host.ru
ServerAlias www.host.ru
DocumentRoot /home/WebServer/www/host.ru/public_html/
ErrorLog /home/WebServer/www/host.ru/logs/error.log
CustomLog /home/WebServer/www/hostu/logs/access.log combined
Alias /error_html/ "/home/WebServer/www/host/error_html/"
<Directory "/home/WebServer/www/host.ru/error_html">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en cs de es fr it nl sv pt-br ro
ForceLanguagePriority Prefer Fallback
</Directory>
ErrorDocument 404 /error_html/HTTP_NOT_FOUND.html
</VirtualHost>
answered Feb 16, 2012 at 8:56
AndreyAndrey
611 silver badge1 bronze badge
Here is a solution. Hope it helps.
DEMO
Go to your site’s folder.
Create a file named .htaccess (just .htaccess no name only file extension).
Open the file and add the line.
ErrorDocument 404 /pathtofile
Replace /pathtofile with your 404 page file name which should be situated in the same folder as the file .htaccess .
The custom 404 file can be in PHP or HTML.
You can also add HTML to it like this:
ErrorDocument 404 ‘<h1>404 Not Found</h1>’
You don’t have to reload Apache Server ! It’s finished. Test it out.
Source — Subin’s Blog
answered Nov 11, 2012 at 12:13
SubinSubin
7504 gold badges16 silver badges32 bronze badges
2
One kind of 404 customization (not yet covered here) is redirecting the 404 page in VPS Ubuntu to a separate page, such as the site’s home page.
To do this, make a file called .htaccess in the web root and put this line in it:
ErrorDocument 404 http://www.yoursite.com
Then save the file.
This will make the 404 page redirect to the specified URL.
Eliah Kagan
116k54 gold badges314 silver badges489 bronze badges
answered Aug 9, 2014 at 10:39
q8fftq8fft
4614 silver badges2 bronze badges
AFAIK you can not customize default error messages of Apache 2.4 in any easy way because those messages are inside the apache2 executable.
However, you can override them using «ErrorDocument» directives which can be used also in apache2.conf.
An even better way could be using Include in apache2.conf and collect overridden messages in one separate file.
Please also see the Apache 2.4 documentation.
kos
35.3k13 gold badges101 silver badges150 bronze badges
answered Dec 26, 2014 at 20:30
ajaaskelajaaskel
931 silver badge5 bronze badges
