Рецепты 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 $status_text { en301 "Moved Permanently"; en302 "Found"; en303 "See Other"; en307 "Temporary Redirect"; en308 "Permanent Redirect"; en400 "Bad Request"; en401 "Authorization Required"; en402 "Payment Required"; en403 "Forbidden"; en404 "Not Found"; en405 "Not Allowed"; en406 "Not Acceptable"; en407 "Proxy Authentication Required"; en408 "Request Time-out"; en409 "Conflict"; en410 "Gone"; en411 "Length Required"; en412 "Precondition Failed"; en413 "Request Entity Too Large"; en414 "Request-URI Too Large"; en415 "Unsupported Media Type"; en416 "Requested Range Not Satisfiable"; en417 "Expectation Failed"; en418 "I'm a teapot"; en421 "Misdirected Request"; en422 "Unprocessable Entity"; en423 "Locked"; en424 "Failed Dependency"; en425 "Too Early"; en426 "Upgrade Required"; en428 "Precondition Required"; en429 "Too Many Requests"; en431 "Request Header Fields Too Large"; en451 "Unavailable For Legal Reasons"; en500 "Internal Server Error"; en501 "Not Implemented"; en502 "Bad Gateway"; en503 "Service Temporarily Unavailable"; en504 "Gateway Time-out"; en505 "HTTP Version Not Supported"; en506 "Variant Also Negotiates"; en507 "Insufficient Storage"; en508 "Loop Detected"; en510 "Not Extended"; en511 "Network Authentication Required"; ru301 "Перемещено Навсегда"; ru302 "Найдено"; ru303 "Смотрите Другое"; ru307 "Перенаправлено Временно"; ru308 "Перенаправлено Навсегда"; ru400 "Неверный Запрос"; ru401 "Требуется Авторизация"; ru402 "Требуется Оплата"; ru403 "Запрещено"; ru404 "Не Найдено"; ru405 "Не Разрешено"; ru406 "Не Приемлемо"; ru407 "Требуется Прокси Аутентификация"; ru408 "Таймаут Запроса"; ru409 "Конфликт"; ru410 "Удалено"; ru411 "Требуется Длина"; ru412 "Предварительное Условие Не Выполнено"; ru413 "Тело Запроса Слишком Большое"; ru414 "Адрес Запроса Слишком Большой"; ru415 "Неподдерживаемый Тип Медиа"; ru416 "Запрошенный Диапазон Не Удовлетворим"; ru417 "Ожидание Не Оправдалось"; ru418 "Я Чайник"; ru421 "Неправильно Адресованный Запрос"; ru422 "Необрабатываемая Сущность"; ru423 "Заблокировано"; ru424 "Неудачная Зависимость"; ru425 "Слишком Рано"; ru426 "Требуется Обновление"; ru428 "Требуется Предварительное Условие"; ru429 "Слишком Много Запросов"; ru431 "Поля Заголовка Запроса Слишком Велики"; ru451 "Недоступно По Юридическим Причинам"; ru500 "Внутренняя Ошибка Сервера"; ru501 "Не Реализовано"; ru502 "Плохой Шлюз"; ru503 "Сервис Временно Недоступен"; ru504 "Таймаут Шлюза"; ru505 "Версия HTTP Не Поддерживается"; ru506 "Вариант Также Ведёт Переговоры"; ru507 "Недостаточно Места"; ru508 "Обнаружена Петля"; ru510 "Не Расширен"; ru511 "Требуется Сетевая Аутентификация"; default "Something is wrong";
}

Ну и

# подключаем наш локейшен обработки страниц об ошибках
include_server nginx/error.conf;

Который автоматом подключится во всех серверах ниже.

Читайте так же:

  • Открытый МикрофонОткрытый Микрофон Описание Событие, где у каждого предпринимателя, самозанятого, маркетолога есть возможность рассказать о себе, своей идее, проекте, услугах о бизнесе более 1000 участникам мероприятия «Маркетинговая Среда 5.0». Таким образом, быть услышанным и найти единомышленников, людей в команду, […]
  • Так вот ты какой, самый мощный среднебюджетный смартфон Samsung. Первые рендеры Galaxy A52sТак вот ты какой, самый мощный среднебюджетный смартфон Samsung. Первые рендеры Galaxy A52s Компания Samsung готовит к выпуску смартфон Galaxy A52s. Как ожидается, он станет самым мощным среднебюджетным смартфоном Samsung. Тем временем, в сети накапливается информация о нём.  Это будет улучшенная версия Galaxy A52 с важным отличием в виде SoC Snapdragon 778G. На этот […]
  • В Google Meet можно будет назначать до 25 соведующихВ Google Meet можно будет назначать до 25 соведующих Google добавил несколько новых функций в сервис видеоконференций Meet. Теперь у пользователей будет больше возможностей для управления собраниями. Какие именно настройки будут доступны, зависит от используемой версии сервиса. Основным нововведением стала возможность назначать […]
  • PostgreSQL 15: Часть 4 или Коммитфест 2022-01PostgreSQL 15: Часть 4 или Коммитфест 2022-01 Первые три коммитфеста 15-й версии (2021-07, 2021-09, 2021-11) не баловали нас крупными изменениями. Не стал исключением и четвертый, январский коммитфест. Но всё-таки найдется о чем рассказать.psql: автодополнение ключевых слов и имен объектов в разных регистрахcommit: 02b8048b, […]