stranger777
@stranger777
Программист

Nginx: код 503 в конфиге по факту оказывается 302. Почему?

server {
listen $ip:$port;
server_name example.com;

location / {
    root   /usr/share/nginx/html;
    index index.html index.htm;
    error_page 503 http://example.com/maintrance.html;
    return 503;
}

location = /maintrance.html {
return 200;
}


Интуитивно ожидаю, что вместе с maintrance.html прилетит код состояния 503, но прилетает 302 (которого нигде в конфиге нет и по дефолту протиснуться ему вроде бы некуда, все коды прописаны явно) и потом прилетает 200. Ну, это понятно.
Почему 302, чего я не знаю и где я дурак? Может быть так и должно быть?

Решение с ожидаемым поведением:
server {
listen $ip:$port;
server_name example.com;

location / {
    root   /usr/share/nginx/html;
    index index.html index.htm;
    error_page 503 /maintrance.html;
    return 503;
}
# Без этого локейшна в такой конфигурации сервер отдаёт не ту страницу для 503:
location /maintrance.html {
return 200;
}

}
  • Вопрос задан
  • 453 просмотра
Решения вопроса 1
@miksir
IT
Так как у вас URL в error_page указан с http и доменом - подразумевается внешний редирект. Отсюда и 302. Для получения того, что вы хотите, пишите
error_page 503 /maintrance.html;
Так же, если вы хотите получить 200 в ответе, не обязательно описывать отдельный локейшн, можно решить все той же error_page, это будет так
error_page 503 =200 /maintrance.html;
И тогда location = /maintrance.html можно выкинуть.

UPD: Да, ступил. Так как error_page делает внутренний редирект, то если нет отдельного location /maintrance.html - сервер снова попадает в location / и получается бесконечный цикл редиректов. Так что в таком случае location /maintrance.html нужен.

Попутно хочу акцентировать внимание на другом способе, более популярном, особенно если нам не нужно выдавать 503.
location / {
    root   /usr/share/nginx/html;
    index index.html index.htm;
    try_files /maintrance.html $uri $uri/ =404;
}

try_files перебирает указанные аргументы пока не встретит существующий на диске. Т.е. в такой конфигурации достаточно создать /usr/share/nginx/html/maintrance.html - начинает выдаваться он, если его удалить - начинают работать обычные запросы (параметр $uri и $uri/).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gromdron
@gromdron
Работаю с Bitrix24
Может это внутреннее? Как-бы 503 - это Service Unaviable, а вы вместо отдачи на /maintrance.html отправляете.
А он уже 200 отдает.

Попробуйте удалить:
location = /maintrance.html {
return 200;
}


Будет ли подобный результат ?
Ответ написан
stranger777
@stranger777 Автор вопроса
Программист
Решение с ожидаемым поведением:
server {
listen $ip:$port;
server_name example.com;

location / {
    root   /usr/share/nginx/html;
    index index.html index.htm;
    error_page 503 /maintrance.html;
    return 503;
}
# Без этого локейшна в такой конфигурации сервер отдаёт не ту страницу для 503:
location /maintrance.html {
return 200;
}

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы