Пользовательские страницы ошибок Apache для 400 и 408
Я создал несколько пользовательских страниц ошибок, и они у меня есть в глобальной конфигурации, поэтому они будут применяться ко всем виртуальным хостам:
Alias /common /var/www/common
ErrorDocument 400 /common/400.shtml
ErrorDocument 401 /common/401.shtml
ErrorDocument 403 /common/403.shtml
ErrorDocument 404 /common/404.shtml
ErrorDocument 405 /common/405.shtml
ErrorDocument 408 /common/408.shtml
ErrorDocument 410 /common/410.shtml
ErrorDocument 421 /common/421.shtml
ErrorDocument 500 /common/500.shtml
ErrorDocument 501 /common/501.shtml
Некоторые из них легче проверить, чем другие.
Для некоторых из них мне пришлось принудительно ввести код ошибки с помощью mod_rewrite (RewriteRule ^(.*)$ - [L,R=XXX]
) и все это работало как положено
Однако я хотел бы протестировать как можно больше из них «органически», то есть вызвать ошибку «по-настоящему», а не вызывать ее с помощью mod_rewrite. Некоторые из них, например 401/403/404, легко проверить в браузере, другие, например 405 и 501, требуют Curl, а третьи требуют ручного подключения через Telnet.
Проблема, с которой я столкнулся, заключается в том, что когда я естественным образом вызываю 400 или 408, Apache, похоже, игнорирует мой ErrorDoc и отображает страницу ошибок по умолчанию:
Тест 400 (отправка запроса HTTP/1.1 без заголовка Host):
# telnet XXXXX
Trying XXXXX
Connected to XXXXX
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Date: Mon, 03 May 2021 16:35:14 GMT
Server: Apache
Content-Length: 546
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<p>Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache Server at XXXXXX</address>
</body></html>
Connection closed by foreign host.
Тест 408 (не отправка пустой строки для завершения запроса, вместо этого ожидание тайм-аута от сервера):
# telnet XXXXX
Trying XXXXX...
Connected XXXX
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.1 408 Request Timeout
Date: Mon, 03 May 2021 16:27:35 GMT
Server: Apache
Content-Length: 420
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>408 Request Timeout</title>
</head><body>
<h1>Request Timeout</h1>
<p>Server timeout waiting for the HTTP request from the client.</p>
<hr>
<address>Apache Server at XXXXXX</address>
</body></html>
Connection closed by foreign host.
#
Интересно, что сервер говорит для них «charset=iso-8859-1» — я привык видеть «charset=utf-8», потому что у меня есть «AddDefaultCharset utf-8» в глобальной конфигурации, и все мои файлы имеют кодировку UTF-8.
Апач/2.4.41