Руководство

Полное руководство по HTTP кодам состояния

Изучите HTTP коды состояния с нашим подробным руководством. Узнайте о всех кодах групп 1xx, 2xx, 3xx, 4xx и 5xx с практическими примерами и лучшими практиками для веб-разработчиков.

Pavel Volkov
29 августа 2025 г.
2 мин чтения

Введение в HTTP коды состояния

HTTP коды состояния — это трёхзначные числа, которые веб-серверы отправляют браузерам для указания результата обработки запроса клиента. Понимание этих кодов критически важно для веб-разработчиков, системных администраторов и всех, кто работает с веб-приложениями.

Понимание структуры

HTTP коды состояния организованы в пять классов на основе первой цифры:

  • 1xx (Информационные): Запрос получен, продолжается обработка
  • 2xx (Успешные): Запрос был успешно получен, понят и принят
  • 3xx (Перенаправление): Требуются дополнительные действия для завершения запроса
  • 4xx (Ошибка клиента): Запрос содержит плохой синтаксис или не может быть выполнен
  • 5xx (Ошибка сервера): Сервер не смог выполнить явно правильный запрос

1xx Информационные ответы

100 Continue

Сервер получил заголовки запроса и клиент должен продолжить отправку тела запроса.

// Пример: загрузка большого файла с заголовком Expect
curl -X POST -H "Expect: 100-continue" -d @largefile.json https://api.example.com/upload

101 Switching Protocols

Сервер переключает протоколы согласно заголовку Upgrade.

2xx Успешные ответы

200 OK

Запрос выполнен успешно. Значение зависит от используемого HTTP метода.

// Пример на PHP
if ($user->save()) {
    http_response_code(200);
    echo json_encode(['status' => 'success', 'user' => $user]);
}

201 Created

Запрос выполнен и в результате создан новый ресурс.

// Пример на JavaScript/Node.js
app.post('/users', (req, res) => {
    const user = new User(req.body);
    user.save()
        .then(() => res.status(201).json(user))
        .catch(err => res.status(400).json({error: err.message}));
});

204 No Content

Сервер успешно обработал запрос, но не возвращает никакого содержимого.

3xx Перенаправление

301 Moved Permanently

Ресурс был постоянно перемещён на новый URL.

# Пример для Apache .htaccess
Redirect 301 /old-page.html /new-page.html

302 Found (Временное перенаправление)

Ресурс временно находится по другому URL.

304 Not Modified

Ресурс не был изменён с версии, указанной в заголовках запроса.

4xx Ошибки клиента

400 Bad Request

Сервер не может обработать запрос из-за ошибки клиента (неправильный синтаксис, некорректное сообщение запроса и т.д.).

// Пример на Python Flask
@app.route('/api/users', methods=['POST'])
def create_user():
    if not request.json or 'email' not in request.json:
        return jsonify({'error': 'Email обязателен'}), 400

401 Unauthorized

Требуется аутентификация, которая не удалась или не была предоставлена.

// Пример middleware на Express.js
function requireAuth(req, res, next) {
    const token = req.headers.authorization;
    if (!token) {
        return res.status(401).json({error: 'Требуется авторизация'});
    }
    // Логика проверки токена здесь
    next();
}

403 Forbidden

У клиента нет прав доступа к содержимому.

404 Not Found

Сервер не может найти запрашиваемый ресурс.

// Пример на Laravel
Route::fallback(function () {
    return response()->json(['error' => 'Маршрут не найден'], 404);
});

5xx Ошибки сервера

500 Internal Server Error

Общее сообщение об ошибке, когда сервер встречает неожиданное условие.

// Пример обработки ошибок
try {
    // Операция, которая может завершиться неудачей
    $result = processComplexOperation();
} catch (Exception $e) {
    error_log("Ошибка сервера: " . $e->getMessage());
    http_response_code(500);
    echo json_encode(['error' => 'Внутренняя ошибка сервера']);
}

502 Bad Gateway

Сервер, действуя как шлюз или прокси, получил недействительный ответ от upstream сервера.

503 Service Unavailable

Сервер в настоящее время недоступен (перегружен или на техническом обслуживании).

Лучшие практики для разработчиков

Согласованность API ответов

Всегда используйте подходящие коды состояния с согласованными форматами ответов:

// Хорошая практика - согласованный формат ошибок
{
    "error": {
        "code": 400,
        "message": "Ошибка валидации",
        "details": {
            "email": ["Email обязателен"],
            "password": ["Пароль должен быть минимум 8 символов"]
        }
    }
}

Обработка ошибок на фронтенде

// JavaScript fetch с правильной обработкой ошибок
async function apiCall(url, options) {
    try {
        const response = await fetch(url, options);
        
        if (!response.ok) {
            if (response.status === 401) {
                // Перенаправление на страницу входа
                window.location.href = '/login';
                return;
            }
            throw new Error(`HTTP ${response.status}: ${response.statusText}`);
        }
        
        return await response.json();
    } catch (error) {
        console.error('API вызов неудачен:', error);
        throw error;
    }
}

Тестирование HTTP кодов состояния

Используйте инструменты как curl, Postman, или пишите автоматизированные тесты для проверки правильности возвращаемых кодов состояния:

# Тестирование с помощью curl
curl -I -X GET https://api.example.com/users/123

# Ожидаемые заголовки ответа
HTTP/2 200 
content-type: application/json
cache-control: max-age=300

Распространённые ошибки, которых следует избегать

  • Возврат 200 OK для ошибок в теле ответа
  • Использование 404 для неавторизованного доступа (используйте 401 или 403 вместо этого)
  • Неимплементация правильного кеширования с 304 Not Modified
  • Игнорирование 5xx ошибок в мониторинге продакшн среды

Мониторинг и логирование

Настройте правильный мониторинг для отслеживания паттернов кодов состояния:

// Пример настройки мониторинга
if (response.status >= 500) {
    logger.error("Ошибка сервера", {
        url: request.url,
        method: request.method,
        status: response.status,
        user_id: user?.id
    });
}

Понимание и правильная реализация HTTP кодов состояния необходимы для создания надёжных, поддерживаемых веб-приложений. Они предоставляют ценную информацию для отладки, мониторинга и создания лучшего пользовательского опыта.

Последнее обновление: 21 сентября 2025 г.