Назад | Перейти на главную страницу

Обработка ошибок в nginx в конфигурации обратного прокси

Я использую nginx в качестве обратного прокси на моем существующем веб-сервере. Я хочу управлять только одним набором настраиваемых страниц ошибок и, в идеале, внутри nginx, поскольку это уровень, наиболее близкий к клиенту.

Теперь я могу использовать error_pages и proxy_intercept_errors настройки. Тем не мение:

  1. В случае ошибок 400 (неверный запрос) мне нужно, чтобы базовый веб-сервер мог просматривать некоторое содержимое тела JSON с подробным описанием причин неправильного запроса. И поэтому мне нужен способ отключить proxy_intercept_errors только для 400 кодов состояния.

  2. я никогда хотите показать страницы ошибок nginx по умолчанию, для любой код состояния. Теперь из того, что я вижу, для достижения этого мне нужно было бы явно перечислить все возможные коды состояния, которые можно вообразить, и иметь для него страницу с ошибкой? Вместо того, чтобы просто использовать подстановочные знаки для всех ошибок, превышающих 500, например.

Мои вопросы: решаются ли указанные выше 2 проблемы в самом nginx? Если нет, есть ли очевидное решение вышеперечисленных проблем?

Я неправильно прочитал документацию. Фактически, обход правил с помощью ошибки 400 - это просто отсутствие директивы страницы ошибки.

Это из proxy_intercept_errors запись в документации:

Если вы установите это значение on, тогда nginx будет перехватывать коды состояния, которые явно обрабатываются директивой error_page. Ответы с кодами состояния, которые не соответствуют директиве error_page, будут отправляться как есть с прокси-сервера. (выделено мной)

Попробуйте следующее. Включите эту карту в свой http-контекст.

map $sent_http_status_code $400 {
  default 0;
  ~400    1;
}

Включите следующее в контекст вашего сервера (конечно, прокси).

if ($400) {
  proxy_pass (socket|address:port);
}

По поводу вашего второго вопроса. Вы можете указать один файл для большего количества ошибок, например следующих:

error_page 500 501 502 503 504 505 /500.html

В Википедии перечислены все действительные коды состояния HTTP с кратким пояснением: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes