Я использую nginx в качестве обратного прокси на моем существующем веб-сервере. Я хочу управлять только одним набором настраиваемых страниц ошибок и, в идеале, внутри nginx, поскольку это уровень, наиболее близкий к клиенту.
Теперь я могу использовать error_pages
и proxy_intercept_errors
настройки. Тем не мение:
В случае ошибок 400 (неверный запрос) мне нужно, чтобы базовый веб-сервер мог просматривать некоторое содержимое тела JSON с подробным описанием причин неправильного запроса. И поэтому мне нужен способ отключить proxy_intercept_errors
только для 400 кодов состояния.
я никогда хотите показать страницы ошибок 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