Рецепты Nginx: локализация страниц об ошибках
Для приготовления локализации страниц об ошибках нам понадобится сам nginx и его плагины error_page_inherit и include_server. Конечно, такую локализацию можно сделать и без этих плагинов, но у неё будет несколько недостатков. Во-первых, если в каком-то локейшене задаётся своя страница об ошибке, то все страницы об ошибках из предыдущих уровней не наследуются для этого уровня. Эту проблему решает первый плагин, позволяя наследовать страницы сообщений об ошибках. А, во-вторых, для каждого сервера придётся вручную включать локейшен обработки страницы об ошибке. И эту проблему как раз решает второй плагин, позволяя наследовать подключение файлов из главной конфигурации во все сервера.
Итак, для начала в отдельном файле error.conf зададим наш локейшен обработки страниц об ошибках, который потом будет включаться во все сервера
location @error {
# задаём дефолтный тип ответа
default_type text/html;
# включаем обработку команд SSI
ssi on;
# возвращаем шаблон страницы об ошибке
return 200 "<!DOCTYPE html><html><head><title>$status $status_text</title></head><body><center><h1>$status $status_text</h1></center><hr></body></html>";
}
Далее, в главной секции
# определяем, какие страницы об ошибках будем шаблонизировать
error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 421 422 423 424 425 426 428 429 431 451 500 501 502 503 504 505 506 507 508 510 511 @error;
# а также указываем наследовать страницы об ошибках
error_page_inherit on;
Теперь
# определяем предпочитаемый язык пользователя
map $http_accept_language $accept_language {
default en; # по-умлочнию - английский
~ru ru; # ну или русский, если задан
}
# определяем текст ошибки по языку пользователя
map $accept_language $status_text {
en $status_text_en;
ru $status_text_ru;
}
# определяем текст ошибки по языку пользователя и коду ошибки
map $status $status_text_en {
301 "Moved Permanently";
302 "Found";
303 "See Other";
307 "Temporary Redirect";
308 "Permanent Redirect";
400 "Bad Request";
401 "Authorization Required";
402 "Payment Required";
403 "Forbidden";
404 "Not Found";
405 "Not Allowed";
406 "Not Acceptable";
407 "Proxy Authentication Required";
408 "Request Time-out";
409 "Conflict";
410 "Gone";
411 "Length Required";
412 "Precondition Failed";
413 "Request Entity Too Large";
414 "Request-URI Too Large";
415 "Unsupported Media Type";
416 "Requested Range Not Satisfiable";
417 "Expectation Failed";
418 "I'm a teapot";
421 "Misdirected Request";
422 "Unprocessable Entity";
423 "Locked";
424 "Failed Dependency";
425 "Too Early";
426 "Upgrade Required";
428 "Precondition Required";
429 "Too Many Requests";
431 "Request Header Fields Too Large";
451 "Unavailable For Legal Reasons";
500 "Internal Server Error";
501 "Not Implemented";
502 "Bad Gateway";
503 "Service Temporarily Unavailable";
504 "Gateway Time-out";
505 "HTTP Version Not Supported";
506 "Variant Also Negotiates";
507 "Insufficient Storage";
508 "Loop Detected";
510 "Not Extended";
511 "Network Authentication Required";
}
map $status $status_text_ru {
301 "Перемещено Навсегда";
302 "Найдено";
303 "Смотрите Другое";
307 "Перенаправлено Временно";
308 "Перенаправлено Навсегда";
400 "Неверный Запрос";
401 "Требуется Авторизация";
402 "Требуется Оплата";
403 "Запрещено";
404 "Не Найдено";
405 "Не Разрешено";
406 "Не Приемлемо";
407 "Требуется Прокси Аутентификация";
408 "Таймаут Запроса";
409 "Конфликт";
410 "Удалено";
411 "Требуется Длина";
412 "Предварительное Условие Не Выполнено";
413 "Тело Запроса Слишком Большое";
414 "Адрес Запроса Слишком Большой";
415 "Неподдерживаемый Тип Медиа";
416 "Запрошенный Диапазон Не Удовлетворим";
417 "Ожидание Не Оправдалось";
418 "Я Чайник";
421 "Неправильно Адресованный Запрос";
422 "Необрабатываемая Сущность";
423 "Заблокировано";
424 "Неудачная Зависимость";
425 "Слишком Рано";
426 "Требуется Обновление";
428 "Требуется Предварительное Условие";
429 "Слишком Много Запросов";
431 "Поля Заголовка Запроса Слишком Велики";
451 "Недоступно По Юридическим Причинам";
500 "Внутренняя Ошибка Сервера";
501 "Не Реализовано";
502 "Плохой Шлюз";
503 "Сервис Временно Недоступен";
504 "Таймаут Шлюза";
505 "Версия HTTP Не Поддерживается";
506 "Вариант Также Ведёт Переговоры";
507 "Недостаточно Места";
508 "Обнаружена Петля";
510 "Не Расширен";
511 "Требуется Сетевая Аутентификация";
}
Ну и
# подключаем наш локейшен обработки страниц об ошибках
include_server /path/to/error.conf;
Который автоматом подключится во всех серверах ниже.