Почти все разработчики так или иначе постоянно работают с api по http, клиентские разработчики работают с api backend своего сайта или приложения, а бэкендеры «дергают» бэкенды других сервисов, как внутренних, так и внешних. И мне кажется, одна из самых главных вещей в хорошем API это формат передачи ошибок. Ведь если это сделано плохо/неудобно, то разработчик, использующий это API, скорее всего не обработает ошибки, а клиенты будут пользоваться молчаливо ломающимся продуктом.
За 7 лет я как поддерживал множество legacy API, так и разрабатывал c нуля. И я поработал, наверное, с большинством стратегий по возвращению ошибок, но каждая из них создавала дискомфорт в той или иной мере. В последнее время я нащупал оптимальный вариант, о котором и хочу рассказать, но с начала расскажу о двух наиболее популярных вариантах.
№1: HTTP статусы
Если почитать апологетов REST, то для кодов ошибок надо использовать HTTP статусы, а текст ошибки отдавать в теле или в специальном заголовке. Например:
Success:
HTTP 200 GET /v1/user/1
Body: { name: 'Вася' }
Error:
HTTP 404 GET /v1/user/1
Body: 'Не найден пользователь'
Если у вас примитивная бизнес-логика или API из 5 url, то в принципе это нормальный подход. Однако как-только бизнес-логика станет сложнее, то начнется ряд проблем.
Http статусы предназначались для описания ошибок при передаче данных, а про логику вашего приложения никто не думал. Статусов явно не хватает для описания всего разнообразия ошибок в вашем проекте, да они и не были для этого предназначены. И тут начинается натягивание «совы на глобус»: все начинают спорить, какой статус ошибки дать в том или ином случае. Пример: Есть API для task manager. Какой статус надо вернуть в случае, если пользователь хочет взять задачу, а ее уже взял в работу другой пользователь? Ссылка на http статусы. И таких проблемных примеров можно придумать много.
REST скорее концепция, чем формат общения из чего следует неоднозначность использования статусов. Разработчики используют статусы как им заблагорассудится. Например, некоторые API при отсутствии сущности возвращают 404 и текст ошибки, а некоторые 200 и пустое тело.
Бэкенд разработчику в проекте непросто выбрать статус для ошибки, а клиентскому разработчику неочевидно какой статус предназначен для того или иного типа ошибок бизнес-логики. По-хорошему в проекте придется держать enum для того, чтобы описать какие ошибки относятся к тому или иному статусу.
Когда бизнес-логика приложения усложняется, начинают делать как-то так:
HTTP 400 PUT /v1/task/1 { status: 'doing' }
Body: { error_code: '12', error_message: 'Задача уже взята другим исполнителем' }
Из-за ограниченности http статусов разработчики начинают вводить “свои” коды ошибок для каждого статуса и передавать их в теле ответа. Другими словами, пользователю API приходится писать нечто подобное:
if (status === 200) {
// Success
} else if (status === 500) {
// some code
} else if (status === 400) {
if (body.error_code === 1) {
// some code
} else if (body.error_code === 2) {
// some code
} else {
// some code
}
} else if (status === 404) {
// some code
} else {
// some code
}
Из-за этого ветвление клиентского кода начинает стремительно расти: множество http статусов и множество кодов в самом сообщении. Для каждого ошибочного http статуса необходимо проверить наличие кодов ошибок в теле сообщения. От комбинаторного взрыва начинает конкретно пухнуть башка! А значит обработку ошибок скорее всего сведут к сообщению типа “Произошла ошибка” или к молчаливому некорректному поведению.
Многие системы мониторинга сервисов привязываются к http статусам, но это не помогает в мониторинге, если статусы используются для описания ошибок бизнес логики. Например, у нас резкий всплеск ошибок 429 на графике. Это началась DDOS атака, или кто-то из разработчиков выбрал неудачный статус?
Итог: Начать с таким подходом легко и просто и для простого API это вполне подойдет. Но если логика стала сложнее, то использование статусов для описания того, что не укладывается в заданные рамки протокола http приводит к неоднозначности использования и последующим костылям для работы с ошибками. Или что еще хуже к формализму, что ведет к неприятному пользовательскому опыту.
№2: На все 200
Есть другой подход, даже более старый, чем REST, а именно: на все ошибки связанные с бизнес-логикой возвращать 200, а уже в теле ответа есть информация об ошибке. Например:
Вариант 1:
Success:
HTTP 200 GET /v1/user/1
Body: { ok: true, data: { name: 'Вася' } }
Error:
HTTP 200 GET /v1/user/1
Body: { ok: false, error: { code: 1, msg: 'Не найден пользователь' } }
Вариант 2:
Success:
HTTP 200 GET /v1/user/1
Body: { data: { name: 'Вася' }, error: null }
Error:
HTTP 200 GET /v1/user/1
Body: { data: null, error: { code: 1, msg: 'Не найден пользователь' } }
На самом деле формат зависит от вас или от выбранной библиотеки для реализации коммуникации, например JSON-API.
Звучит здорово, мы теперь отвязались от http статусов и можем спокойно ввести свои коды ошибок. У нас больше нет проблемы “впихнуть невпихуемое”. Выбор нового типа ошибки не вызывает споров, а сводится просто к введению нового числового номера (например, последовательно) или строковой константы. Например:
module.exports = {
NOT_FOUND: 1,
VALIDATION: 2,
// ….
}
module.exports = {
NOT_FOUND: ‘NOT_AUTHORIZED’,
VALIDATION: ‘VALIDATION’,
// ….
}
Клиентские разработчики просто основываясь на кодах ошибок могут создать классы/типы ошибок и притом не бояться, что сервер вернет один и тот же код для разных типов ошибок (из-за бедности http статусов).
Обработка ошибок становится менее ветвящейся, множество http статусов превратились в два: 200 и все остальные (ошибки транспорта).
if (status === 200) {
if (body.error) {
var error = body.error;
if (error.code === 1) {
// some code
} else if (error.code === 2) {
// some code
} else {
// some code
}
} else {
// Success
}
} else {
// transport erros
}
В некоторых случаях, если есть библиотека десериализации данных, она может взять часть работы на себя. Писать SDK вокруг такого подхода проще нежели вокруг той или иной имплементации REST, ведь реализация зависит от того, как это видел автор. Кроме того, теперь никто не вызовет случайное срабатывание alert в мониторинге из-за того, что выбрал неудачный код ошибки.
Но неудобства тоже есть:
-
Избыточность полей при передаче данных, т.е. нужно всегда передавать 2 поля: для данных и для ошибки. Это усложняет чтение логов и написание документации.
-
При использовании средств отладки (Chrome DevTools) или других подобных инструментов вы не сможете быстро найти ошибочные запросы бизнес логики, придется обязательно заглянуть в тело ответа (ведь всегда 200)
-
Мониторинг теперь точно будет срабатывать только на ошибки транспорта, а не бизнес-логики, но для мониторинга логики надо будет дописывать парсинг тела сообщения.
В некоторых случаях данный подход вырождается в RPC, то есть по сути вообще отказываются от использования url и шлют все на один url методом POST, а в теле сообщения передают все параметры. Мне кажется это не правильным, ведь url это прекрасный именованный namespace, зачем от этого отказываться, не понятно?! Кроме того, RPC создает проблемы:
-
нельзя кэшировать по http GET запросы, так как замешали чтение и запись в один метод POST
-
нельзя делать повторы для неудавшихся GET запросов (на backend) на реверс-прокси (например, nginx) по указанной выше причине
-
имеются проблемы с документированием – swagger и ApiDoc не подходят, а удобных аналогов я не нашел
Итог: Для сложной бизнес-логики с большим количеством типов ошибок такой подход лучше, чем расплывчатый REST, не зря в проектах c “разухабистой” бизнес-логикой часто именно такой подход и используют.
№3: Смешанный
Возьмем лучшее от двух миров. Мы выберем один http статус, например, 400 или 422 для всех ошибок бизнес-логики, а в теле ответа будем указывать код ошибки или строковую константу. Например:
Success:
HTTP 200 /v1/user/1
Body: { name: 'Вася' }
Error:
HTTP 400 /v1/user/1
Body: { error: { code: 1, msg: 'Не найден пользователь' } }
Коды:
-
200 – успех
-
400 – ошибка бизнес логики
-
остальное ошибки в транспорте
Тело ответа для удачного запроса у нас имеет произвольную структуру, а вот для ошибки есть четкая схема. Мы избавляемся от избыточности данных (поле ошибки/данных) благодаря использованию http статуса в сравнении со вторым вариантом. Клиентский код упрощается в плане обработки ошибки (в сравнении с первым вариантом). Также мы снижаем его вложенность за счет использования отдельного http статуса для ошибок бизнес логики (в сравнении со вторым вариантом).
if (status === 200) {
// Success
} else if (status === 400) {
if (body.error.code === 1) {
// some code
} else if (body.error.code === 2) {
// some code
} else {
// some code
}
} else {
// transport erros
}
Мы можем расширять объект ошибки для детализации проблемы, если хотим. С мониторингом все как во втором варианте, дописывать парсинг придется, но и риска “стрельбы” некорректными alert нету. Для документирования можем спокойно использовать Swagger и ApiDoc. При этом сохраняется удобство использования инструментов разработчика, таких как Chrome DevTools, Postman, Talend API.
Итог: Использую данный подход уже в нескольких проектах, где множество типов ошибок и все крайне довольны, как клиентские разработчики, так и бэкендеры. Внедрение новой ошибки не вызывает споров, проблем и противоречий. Данный подход объединяет преимущества первого и второго варианта, при этом код более читабельный и структурированный.
Самое главное какой бы формат ошибок вы бы не выбрали лучше обговорить его заранее и следовать ему. Если эту вещь пустить на “самотек”, то очень скоро обработка ошибок в проекте станет невыносимо сложной для всех.
P.S. Иногда ошибки любят передавать массивом
{ error: [{ code: 1, msg: 'Не найден пользователь' }] }
Но это актуально в основном в двух случаях:
-
Когда наш API выступает в роли сервиса без фронтенда (нет сайта/приложения). Например, сервис платежей.
-
Когда в API есть url для загрузки какого-нибудь длинного отчета в котором может быть ошибка в каждой строке/колонке. И тогда для пользователя удобнее, чтобы ошибки в приложении сразу показывались все, а не по одной.
В противном случае нет особого смысла закладываться сразу на массив ошибок, потому что базовая валидация данных должна происходить на клиенте, зато код упрощается как на сервере, так и на клиенте. А user-experience хакеров, лезущих напрямую в наше API, не должен нас волновать?HTTP
После определения формата отправляемых документов сервер СБИС зафиксировал фатальные ошибки в форматно-логическом контроле.
Примеры расширенной части сообщения:
- Файл ON_SCHET_2BEcf64bba310444f5daed3cc864750e188_2BE7ed0b1f69af611e3845e005056b76e76_20140411_fc2c44c6-c131-11e3-ac8c-005056b74802.xml
ошибки: [Отсутствует обязательный атрибут «Файл.Документ.СвСчет.СвПокуп.ИдСв.СвФЛ.ФИОИП.Имя»] - Файл ON_SCHET_2BE50afaf555e874a7cbd5d0d5ab3abc4f0_2BE7ed0b1f69af611e3845e005056b76e76_20140411_4469965e-c13c-11e3-9f08-005056b74802.xml
ошибки: [Значение «2/4стр23Б» атрибута «Файл.Документ.СвСчет.СвПокуп.Адрес.АдрРФ.Дом» больше максимально допустимой длины (8)]
Причина №1. Вложение документа не соответствует утвержденному формату
- Проверьте вложения документа на соответствие утвержденным форматам. Исправьте формат вложения.
- Если при отправке вы указываете тип вложения («Документ.Вложение.Тип») — проверьте, соответствует ил он реальному типу вложения.
- Повторите отправку документа.
Причина №2. СБИС неправильно классифицирует неутвержденный формат и принимает его за утвержденный с ошибками
Обратитесь в техподдержку и предоставьте описание вашего формата документа. Мы дадим рекомендации к исправлению ошибки определения формата либо зарегистрируем ваш формат в справочнике для загрузки.
Нашли неточность? Выделите текст с ошибкой и нажмите ctrl + enter.
Во время выбрасывания исключений Laravel проверяет, есть ли в классе исключения метод render(), если да, то он использует метод этого исключения для отображения результата. Если вы не хотите полагаться на глобальную систему отлова исключений Laravel, то можете вернуть ответ в JSON напрямую из контроллера.
Laravel пытается преобразовать исключения в читаемый формат в зависимости от ожидаемого от клиента формата ответа, будь то HTML или JSON, сначала он преобразует различные форматы исключений в простое исключение типа HttpException:
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
} elseif ($e instanceof AuthorizationException) {
$e = new HttpException(403, $e->getMessage());
} elseif ($e instanceof TokenMismatchException) {
$e = new HttpException(419, $e->getMessage());
}
И только затем он обрабатывает некоторые исключения особым образом.
IlluminateHttpExceptionsHttpResponseException — это особое исключение, встроенное в Laravel. Особенность этого исключения заключается в том, что оно уже содержит шаблон ответа для клиента, поэтому Laravel просто возвращает ответ из этого исключения.
Рендеринг исключений аутентификации
Исключение аутентификации IlluminateAuthAuthenticationException обрабатывается с использованием метода unauthenticated(), который по умолчанию редиректит пользователя на URL-адрес /login для повторной аутентификации. Но, в случае, если клиент присылает заголовок Accept: application/json то будет возвращён объект в формате JSON и 401 статусом:
{"message" : "Unauthenticated."}
Конечно, Laravel не считался бы гибким фреймворком, если бы это поведение нельзя было изменить.
Рендеринг исключений при валидации
В случае, когда выбрасывается исключение типа IlluminateValidationValidationException, фреймворк перенаправляет пользователя на URL-адрес с которого пользователь делал запрос, передавая сессией список из всех ошибок валидации, и это дает вам возможность проверить, содержит ли переменная $errors любые ошибки, которые вы можете вывести на экране:
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
Если клиентом был запрошен формат представления — JSON, то Laravel возвращает объект с HTTP-кодом 422, который выглядит следующим образом:
{
"message": "The given data failed to pass validation.",
"errors": {
"email": [
"The email field is required.",
"The field under validation must be formatted as an e-mail address."
]
}
}
Рендеринг остальных исключений
На этом этапе все специальные исключения либо преобразуются в простое исключение HttpException, либо обрабатываются особым образом. Для остальных же исключений, Laravel сначала проверяет, какой из форматов ответа ожидает клиент: HTML или JSON, а затем, исходя из этого, действует соответствующим образом.
Как Laravel определяет какой формат ответа клиент ожидает получить?
Laravel использует метод expectedJson() класса IlluminateHttpRequest. Этот метод проверяет наличие заголовка X-Requested-With и содержит ли он значение XMLHttpRequest. Подобный заголовок устанавливается большинством структур JavaScript при AJAX запросе, и Laravel использует его, чтобы предположить, что запрос действительно является AJAX-запросом. Однако, помимо этого, Laravel также проверяет заголовок X-PJAX в запросе и просто возвращает false, если он присутствует, поскольку этот заголовок указывает на то, что ответ должен быть не в формате JSON, а в виде обычного HTML-кода.
Наконец, он проверяет заголовок Accept, в котором проверяет, ожидает ли клиент JSON в ответ.
Итак, если клиент ожидает JSON-ответ, как Laravel преобразует исключение в JSON?
Если в конфигах фреймворка, параметру app.debug задано значение true, Laravel преобразует исключение в формат JSON со следующей структурой:
{
"message": "...",
"file": "...",
"line": ...,
"trace": "..."
}
Это очень помогает во время разработки, так как это дает больше информации разработчику, для понимания того, что пошло не так во время обработки запроса. Однако, очевидно, что параметру app.debug не должно быть установлено значение true в продакшене, поскольку подобное сообщение может предоставить конфиденциальную информацию сторонним лицам. В этом случае Laravel, проверяется, является ли выброшенное исключение типом HttpException, и возвращает сообщение об ошибке в виде следующей структуры JSON:
{
"message": "..."
}
Однако, если исключение не является подтипом HTTP, или исключения с кодом 500, Laravel просто возвращает сообщение «Server Error»:
{
"message": "Server Error"
}
Если вы доверяете пользователям своего API, то создайте кастомное исключение типа HTTP, и они смогут получать сообщения ошибок. Иначе же Laravel возьмёт работу по защите ваших данных, скрыв фактическое сообщение исключения, и покажет только ошибку «Server Error».
Что происходит, когда ожидается ответ в формате HTML?
Сначала Laravel проверяет, есть ли у вас какие-либо представления в вашем каталоге resources/views/errors с именем кода состояния статуса ошибки, например, 404.blade.php, 500.blade.php, .... Если представление существует, то Laravel отображает его в браузере клиента.
Если такого представления не было найдено, Laravel будет использовать обработчик исключений по умолчанию, коим является обработчик от Symfony. Он отображает красивое представление с детальной информацией об исключении в случае, если app.debug включен, или «Whoops, looks like something went wrong.», если режим отладки отключён.
Изменение стандартного формата отображения ошибок
Иногда возникает необходимость в изменении формата отображения ошибок валидации при AJAX-запросе. По умолчанию Laravel показывает ошибки в формате:
{
"message":"The given data was invalid.",
"errors": {
"name": ["The name field is required."],
"email": ["The email must be a valid email address.", "The email must be at least 4 characters."]
}
}
Если вам нужно кастомизировать этот ответ, и сделать какой-то нестандартный вывод, к примеру, вывод только списка сообщений, без группировки их под соответствующими ключами, то нужно изменить файл app/Exceptions/Handler.php:
// проверяем, что это AJAX запрос, или ответ требуется вернуть в формате JSON
if(($request->ajax() && !$request->pjax()) || $request->wantsJson()) {
// проверяем, что исключение является типом ошибки валидации
if($exception instanceof ValidationException) {
return new JsonResponse([
'success' => false,
'errors' => IlluminateSupportArr::collapse($exception->errors()),
'message' => $exception->getMessage()
], 422);
}
return new JsonResponse([
'success' => false,
'message' => $exception->getMessage()
], 422);
}
В результате этой модификации, ответ будет выглядеть:
{
"success":false,
"errors": [
"The name field is required.",
"The email must be a valid email address.",
"The email must be at least 4 characters."
],
"message":"The given data was invalid."
}
Аналогично этому вы можете кастомизировать индивидуально любой тип исключения. Или же, можете написать общий обработчик для всех исключений. Типа того, что был добавлен несколько ниже обработки исключений валидации:
return new JsonResponse([
'success' => false,
'message' => $exception->getMessage()
], 422);
Резюме
В этой статье я подробно рассказал, как работает отлов и обработка исключений в Laravel. Был показан весь их жизненный цикл, и объяснена работа каждого из них. Так же, был продемонстрирован пример того, как отобразить кастомный ответ в JSON при ошибках валидации, и различных HTTP-статусах. Эта статья появилась после написания первой статьи о создании кастомных страниц при исключениях, где были рассмотрены примеры отлова исключений и соответствующех их индивидуальной обработки. После прочтения этих статей вы можете сказать, что знаете об обработке исключений в Laravel почти всё.
Содержание
Составили подробный классификатор кодов состояния HTTP. Добавляйте в закладки, чтобы был под рукой, когда понадобится.
Что такое код ответа HTTP
Когда посетитель переходит по ссылке на сайт или вбивает её в поисковую строку вручную, отправляется запрос на сервер. Сервер обрабатывает этот запрос и выдаёт ответ — трехзначный цифровой код HTTP от 100 до 510. По коду ответа можно понять реакцию сервера на запрос.
Первая цифра в ответе обозначает класс состояния, другие две — причину, по которой мог появиться такой ответ.
Как проверить код состояния страницы
Проверить коды ответа сервера можно вручную с помощью браузера и в панелях веб‑мастеров: Яндекс.Вебмастер и Google Search Console.
В браузере
Для примера возьмём Google Chrome.
-
Откройте панель разработчика в браузере клавишей F12, комбинацией клавиш Ctrl + Shift + I или в меню браузера → «Дополнительные инструменты» → «Инструменты разработчика». Подробнее об этом рассказывали в статье «Как открыть исходный код страницы».
-
Переключитесь на вкладку «Сеть» в Инструментах разработчика и обновите страницу:

В Яндекс.Вебмастере
Откройте инструмент «Проверка ответа сервера» в Вебмастере. Введите URL в специальное поле и нажмите кнопку «Проверить»:

Как добавить сайт в Яндекс.Вебмастер и другие сервисы Яндекса
В Google Search Console
Чтобы посмотреть код ответа сервера в GSC, перейдите в инструмент проверки URL — он находится в самом верху панели:

Введите ссылку на страницу, которую хотите проверить, и нажмите Enter. В результатах проверки нажмите на «Изучить просканированную страницу» в блоке «URL есть в индексе Google».

А затем в открывшемся окне перейдите на вкладку «Подробнее»:

Теперь расскажем подробнее про все классы кодов состояния HTTP.
1* класс кодов (информационные сообщения)
Это системный класс кодов, который только информирует о процессе передачи запроса. Такие ответы не являются ошибкой, хотя и могут отображаться в браузере как Error Code.
100 Continue
Этот ответ сообщает, что полученные сведения о запросе устраивают сервер и клиент может продолжать отправлять данные. Такой ответ может требоваться клиенту, если на сервер отправляется большой объём данных.
101 Switching Protocols
Сервер одобрил переключение типа протокола, которое запросил пользователь, и в настоящий момент выполняет действие.
102 Processing
Запрос принят — он находится в обработке, и на это понадобится чуть больше времени.
103 Checkpoint
Контрольная точка — используется в запросах для возобновления после прерывания запросов POST или PUT.
POST отправляет данные на сервер, PUT создает новый ресурс или заменяет существующий данными, представленными в теле запроса.
Разница между ними в том, что PUT работает без изменений: повторное его применение даёт такой же результат, что и в первый раз, а вот повторный вызов одного и того же метода POST часто меняет данные.
Пример — оформленный несколько раз интернет‑заказ. Такое часто происходит как раз по причине неоднократного использования запроса PUT.
105 Name Not Resolved
Не удается преобразовать DNS‑адрес сервера — это означает ошибку в службе DNS. Эта служба преобразует IP‑адреса в знакомые нам доменные имена.
2* класс кодов (успешно обработанные запросы)
Эти коды информируют об успешности принятия и обработки запроса. Также сервер может передать заголовки или тело сообщений.
200 ОК
Все хорошо — HTTP‑запрос успешно обработан (не ошибка).
201 Created
Создано — транзакция успешна, сформирован новый ресурс или документ.
202 Accepted
Принято — запрос принят, но ещё не обработан.
203 Non‑Authoritative Information
Информация не авторитетна — запрос успешно обработан, но передаваемая информация была взята не из первичного источника (данные могут быть устаревшими).
204 No Content
Нет содержимого — запрос успешно обработан, однако в ответе только заголовки без контента сообщения. Не нужно обновлять содержимое документа, но можно применить к нему полученные метаданные.
205 Reset Content
Сбросить содержимое. Запрос успешно обработан — но нужно сбросить введенные данные. Страницу можно не обновлять.
206 Partial Content
Частичное содержимое. Сервер успешно обработал часть GET‑запроса, а другую часть вернул.
GET — метод для чтения данных с сайта. Он говорит серверу, что клиент хочет прочитать какой‑то документ.
Представим интернет‑магазин и страницы каталога. Фильтры, которые выбирает пользователь, передаются благодаря методу GET. GET‑запрос работает с получением данных, а POST‑запрос нужен для отправки данных.
При работе с подобными ответами следует уделить внимание кэшированию.
207 Multi‑Status
Успешно выполнено несколько операций — сервер передал результаты выполнения нескольких независимых операций. Они появятся в виде XML‑документа с объектом multistatus.
226 IM Used
Успешно обработан IM‑заголовок (специальный заголовок, который отправляется клиентом и используется для передачи состояния HTTP).
3* класс кодов (перенаправление на другой адрес)
Эти коды информируют, что для достижения успешной операции нужно будет сделать другой запрос, возможно, по другому URL.
300 Multiple Choices
Множественный выбор — сервер выдает список нескольких возможных вариантов перенаправления (максимум — 5). Можно выбрать один из них.
301 Moved Permanently
Окончательно перемещено — страница перемещена на другой URL, который указан в поле Location.
302 Found/Moved
Временно перемещено — страница временно перенесена на другой URL, который указан в поле Location.
303 See Other
Ищите другую страницу — страница не найдена по данному URL, поэтому смотрите страницу по другому URL, используя метод GET.
304 Not Modified
Модификаций не было — с момента последнего визита клиента изменений не было.
305 Use Proxy
Используйте прокси — запрос к нужному ресурсу можно сделать только через прокси‑сервер, URL которого указан в поле Location заголовка.
306 Unused
Зарезервировано. Код в настоящий момент не используется.
307 Temporary Redirect
Временное перенаправление — запрашиваемый ресурс временно доступен по другому URL.
Этот код имеет ту же семантику, что код ответа 302 Found, за исключением того, что агент пользователя не должен изменять используемый метод HTTP: если в первом запросе использовался POST, то во втором запросе также должен использоваться POST.
308 Resume Incomplete
Перемещено полностью (навсегда) — запрашиваемая страница была перенесена на новый URL, указанный в поле Location заголовка. Метод запроса (GET/POST) менять не разрешается.
4* класс кодов (ошибки на стороне клиента)
Эти коды указывают на ошибки со стороны клиентов.

400 Bad Request
Неверный запрос — запрос клиента не может быть обработан, так как есть синтаксическая ошибка (возможно, опечатка).
401 Unauthorized
Не пройдена авторизация — запрос ещё в обработке, но доступа нет, так как пользователь не авторизован.
Для доступа к запрашиваемому ресурсу клиент должен представиться, послав запрос, включив при этом в заголовок сообщения поле Authorization.
402 Payment Required
Требуется оплата — зарезервировано для использования в будущем. Код предусмотрен для платных пользовательских сервисов, а не для хостинговых компаний.
403 Forbidden
Запрещено — запрос принят, но не будет обработан, так как у клиента недостаточно прав. Может возникнуть, когда пользователь хочет открыть системные файлы (robots, htaccess) или не прошёл авторизацию.
404 Not Found
Не найдено — запрашиваемая страница не обнаружена. Сервер принял запрос, но не нашёл ресурса по указанному URL (возможно, была ошибка в URL или страница была перемещена).
405 Method Not Allowed
Метод не разрешён — запрос был сделан методом, который не поддерживается данным ресурсом. Сервер должен предложить доступные методы решения в заголовке Allow.
406 Not Acceptable
Некорректный запрос — неподдерживаемый поисковиком формат запроса (поисковый робот не поддерживает кодировку или язык).
407 Proxy Authentication Required
Нужно пройти аутентификацию прокси — ответ аналогичен коду 401, только нужно аутентифицировать прокси‑сервер.
408 Request Timeout
Тайм‑аут запроса — запрос клиента занял слишком много времени. На каждом сайте существует свое время тайм‑аута — проверьте интернет‑соединение и просто обновите страницу.
409 Conflict
Конфликт (что‑то пошло не так) — запрос не может быть выполнен из‑за конфликтного обращения к ресурсу (несовместимость двух запросов).
410 Gone
Недоступно — ресурс раньше был размещён по указанному URL, но сейчас удалён и недоступен (серверу неизвестно месторасположение).
411 Length Required
Добавьте длины — сервер отклоняет отправляемый запрос, так как длина заголовка не определена, и он не находит значение Content‑Length.
Нужно исправить заголовки на сервере, и в следующий раз робот сможет проиндексировать страницу.
412 Precondition Failed
Предварительное условие не выполнено — стоит проверить правильность HTTP‑заголовков данного запроса.
413 Request Entity Too Large
Превышен размер запроса — перелимит максимального размера запроса, принимаемого сервером. Браузеры поддерживают запросы от 2 до 8 килобайт.
414 Request‑URI Too Long
Превышена длина запроса — сервер не может обработать запрос из‑за длинного URL. Такая ошибка может возникнуть, например, когда клиент пытается передать чересчур длинные параметры через метод GET, а не POST.
415 Unsupported Media Type
Формат не поддерживается — сервер не может принять запрос, так как данные подгружаются в некорректном формате, и сервер разрывает соединение.
416 Requested Range Not Satisfiable
Диапазон не поддерживается — ошибка возникает в случаях, когда в самом HTTP‑заголовке прописывается некорректный байтовый диапазон.
Корректного диапазона в необходимом документе может просто не быть, или есть опечатка в синтаксисе.
417 Expectation Failed
Ожидания не оправдались — прокси некорректно идентифицировал содержимое поля «Expect: 100‑Continue».
418 I’m a teapot
Первоапрельская шутка разработчиков в 1998 году. В расшифровке звучит как «я не приготовлю вам кофе, потому что я чайник». Не используется в работе.
422 Unprocessable Entity
Объект не обработан — сервер принял запрос, но в нём есть логическая ошибка. Стоит посмотреть в сторону семантики сайта.
423 Locked
Закрыто — ресурс заблокирован для выбранного HTTP‑метода. Можно перезагрузить роутер и компьютер. А также использовать только статистический IP.
424 Failed Dependency
Неуспешная зависимость — сервер не может обработать запрос, так как один из зависимых ресурсов заблокирован.
Выполнение запроса напрямую зависит от успешности выполнения другой операции, и если она не будет успешно завершена, то вся обработка запроса будет прервана.
425 Unordered Collection
Неверный порядок в коллекции — ошибка возникает, если клиент указал номер элемента в неупорядоченном списке или запросил несколько элементов в порядке, отличном от серверного.
426 Upgrade Required
Нужно обновление — в заголовке ответа нужно корректно сформировать поля Upgrade и Connection.
Этот ответ возникает, когда серверу требуется обновление до SSL‑протокола, но клиент не имеет его поддержки.
428 Precondition Required
Нужно предварительное условие — сервер просит внести в запрос информацию о предварительных условиях обработки данных, чтобы выдавать корректную информацию по итогу.
429 Too Many Requests
Слишком много запросов — отправлено слишком много запросов за короткое время. Это может указывать, например, на попытку DDoS‑атаки, для защиты от которой запросы блокируются.
431 Request Header Fields Too Large
Превышена длина заголовков — сервер может и не отвечать этим кодом, вместо этого он может просто сбросить соединение.
Исправляется это с помощью сокращения заголовков и повторной отправки запроса.
434 Requested Host Unavailable
Адрес запрашиваемой страницы недоступен.
444 No Response
Нет ответа — код отображается в лог‑файлах, чтобы подтвердить, что сервер никак не отреагировал на запрос пользователя и прервал соединение. Возвращается только сервером nginx.
Nginx — программное обеспечение с открытым исходным кодом. Его используют для создания веб‑серверов, а также в качестве почтового или обратного прокси‑сервера. Nginx решает проблему падения производительности из‑за роста трафика.
449 Retry With
Повторите попытку — ошибка говорит о необходимости скорректировать запрос и повторить его снова. Причиной становятся неверно указанные параметры (возможно, недостаточно данных).
450 Blocked by Windows Parental Controls
Заблокировано родительским контролем — говорит о том, что с компьютера попытались зайти на заблокированный ресурс. Избежать этой ошибки можно изменением параметров системы родительского контроля.
451 Unavailable For Legal Reasons
Недоступно по юридическим причинам — доступ к ресурсу закрыт, например, по требованию органов государственной власти или по требованию правообладателя в случае нарушения авторских прав.
456 Unrecoverable Error
Неустранимая ошибка — при обработке запроса возникла ошибка, которая вызывает некорректируемые сбои в таблицах баз данных.
499 Client Closed Request
Запрос закрыт клиентом — нестандартный код, используемый nginx в ситуациях, когда клиент закрыл соединение, пока nginx обрабатывал запрос.
5* класс кодов (ошибки на стороне сервера)
Эти коды указывают на ошибки со стороны серверов.
При использовании всех методов, кроме HEAD, сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя. И его можно использовать в работе.

500 Internal Server Error
Внутренняя ошибка сервера — сервер столкнулся с неким условием, из‑за которого не может выполнить запрос.
Проверяйте, корректно ли указаны директивы в системных файлах (особенно htaccess) и нет ли ошибки прав доступа к файлам. Обратите внимание на ошибки внутри скриптов и их медленную работу.
501 Not Implemented
Не выполнено — код отдается, когда сам сервер не может идентифицировать метод запроса.
Сами вы эту ошибку не исправите. Устранить её может только сервер.
502 Bad Gateway
Ошибка шлюза — появляется, когда сервер, выступая в роли шлюза или прокси‑сервера, получил ответное сообщение от вышестоящего сервера о несоответствии протоколов.
Актуально исключительно для прокси и шлюзовых конфигураций.
503 Service Unavailable
Временно не доступен — сервер временно не имеет возможности обрабатывать запросы по техническим причинам (обслуживание, перегрузка и прочее).
В поле Retry‑After заголовка сервер укажет время, через которое можно повторить запрос.
504 Gateway Timeout
Тайм‑аут шлюза — сервер, выступая в роли шлюза или прокси‑сервера, не получил ответа от вышестоящего сервера в нужное время.
Исправить эту ошибку самостоятельно не получится. Здесь дело в прокси, часто — в веб‑сервере.
Первым делом просто обновите веб‑страницу. Если это не помогло, нужно почистить DNS‑кэш. Для этого нажмите горячие клавиши Windows+R и введите команду cmd (Control+пробел). В открывшемся окне укажите команду ipconfig / flushdns и подтвердите её нажатием Enter.
505 HTTP Version Not Supported
Сервер не поддерживает версию протокола — отсутствует поддержка текущей версии HTTP‑протокола. Нужно обеспечить клиента и сервер одинаковой версией.
506 Variant Also Negotiates
Неуспешные переговоры — с такой ошибкой сталкиваются, если сервер изначально настроен неправильно. По причине ошибочной конфигурации выбранный вариант указывает сам на себя, из‑за чего процесс и прерывается.
507 Insufficient Storage
Не хватает места для хранения — серверу недостаточно места в хранилище. Нужно либо расчистить место, либо увеличить доступное пространство.
508 Loop Detected
Обнаружен цикл — ошибка означает провал запроса и выполняемой операции в целом.
509 Bandwidth Limit Exceeded
Превышена пропускная способность — используется при чрезмерном потреблении трафика. Владельцу площадки следует обратиться к своему хостинг‑провайдеру.
510 Not Extended
Не продлён — ошибка говорит, что на сервере отсутствует нужное для клиента расширение. Чтобы исправить проблему, надо убрать часть неподдерживаемого расширения из запроса или добавить поддержку на сервер.
511 Network Authentication Required
Требуется аутентификация — ошибка генерируется сервером‑посредником, к примеру, сервером интернет‑провайдера, если нужно ввести пароль для получения доступа к сети через платную точку доступа.
Уделим внимание одному из наиболее часто возникающих багов программы. Ниже будет подробно рассмотрена ошибка формата потока 1С 8: как исправить ее, мы обязательно расскажем, но сначала выясним, почему она вообще появляется и какие ее виды существуют. Постараемся дать максимум подробностей, чтобы вы понимали, что лучше сделать – почистить кэш, запустить тестирование и восстановление, обновить ПО, – что удобнее конкретно в вашем случае.
А в том, что эту проблему придется как-то решать, сомнений нет никаких, ведь она делает нормальную работу в системе невозможной. Потому что при ее возникновении на экране появляется специальное сообщение, которое предлагает два действия на выбор – либо просто закрыть приложение, либо перезапустить его. Сразу скажем, перезагрузка не помогает.
Еще одно неудобство в низкой информативности такого уведомления. Оно не несет никаких объяснений – только 2 кнопки, и нажатие на любую из них, по сути, ничего не дает. Поэтому давайте разбираться.
Что значит в 1С «Ошибка формата потока»
Это баг, связанный с затруднениями чтения кэша при обращении к базе данных (БД). Может проявляться на разных этапах работы (или подготовки к ней), то есть как при запуске программы, так и при открытии или заполнении отчета, проведении какого-нибудь бланка и тому подобное.
Есть сразу несколько причин ее возникновения (рассмотрим их ниже), но она в любом случае свидетельствует о наличии неверных сведений в БД системы, требующих актуализации, исправления, восстановления. Входит в топ-3 проблем по частоте «диагностирования», так что будьте готовы к тому, что вам, скорее всего, тоже придется выбирать подходящее решение.
Описание ошибки информации потока в 1С
Выглядит как всплывающее окно следующего вида:
Максимально лаконично: две кнопки на выбор – и нет конкретики.
Увидев подобное уведомление впервые, неопытный пользователь даже несколько теряется. Понятно почему: в самом сообщении нет подробностей, отсутствует какой-то пояснительный текст, хотя бы краткий. Поэтому человеку в принципе не очень ясно, что делать: он жмет на «Перезапустить», но проблема повторяется. Он перезагружает компьютер – результат тот же. Решение лежит несколько глубже.
Готовые решения для всех направлений

Ускорь работу сотрудников склада при помощи мобильной автоматизации. Навсегда устраните ошибки при приёмке, отгрузке, инвентаризации и перемещении товара.
Узнать больше

Мобильность, точность и скорость пересчёта товара в торговом зале и на складе, позволят вам не потерять дни продаж во время проведения инвентаризации и при приёмке товара.
Узнать больше

Обязательная маркировка товаров — это возможность для каждой организации на 100% исключить приёмку на свой склад контрафактного товара и отследить цепочку поставок от производителя.
Узнать больше

Скорость, точность приёмки и отгрузки товаров на складе — краеугольный камень в E-commerce бизнесе. Начни использовать современные, более эффективные мобильные инструменты.
Узнать больше

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

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

Первое в России готовое решение для учёта товара по RFID-меткам на каждом из этапов цепочки поставок.
Узнать больше

Исключи ошибки сопоставления и считывания акцизных марок алкогольной продукции при помощи мобильных инструментов учёта.
Узнать больше

Получение сертифицированного статуса партнёра «Клеверенс» позволит вашей компании выйти на новый уровень решения задач на предприятиях ваших клиентов..
Узнать больше

Используй современные мобильные инструменты для проведения инвентаризации товара. Повысь скорость и точность бизнес-процесса.
Узнать больше
Показать все решения по автоматизации
Список причин появления ошибки потока данных в 1С 8 3
В процессе своей работы программа делает все для оптимизации скорости проведения операций. Для чего она и создает кэш на ПК, то есть системные папки, в них записывается та информация, которая впоследствии часто используется, а именно:
- пользовательские настройки;
- сведения о регулярно выполняемых действиях;
- размеры размещения функциональных окон.
В результате, когда ПО нужные какие-то данные, оно обращается к cash’у, а не к внешнему серверу, а значит получает ответ быстрее и снижает нагрузку на ОС, что оборачивается увеличением производительности.
Но что будет, если в момент записи в кэш или загрузки из него произойдет какая-то внештатная (с точки зрения системы) ситуация? Например, софт зависнет или ПК выключится из-за скачка напряжения. Тогда файлы, с которыми программа взаимодействовала в тот момент, получат повреждения. И во время следующего запуска ПО вы увидите то самое сообщение, после которого дальнейшая работа перестанет быть возможной.
В 1C ошибка потока также иногда возникает из-за некорректного сохранения справочника, реестра или другого документа, к которому впоследствии будет обращаться система. Это гораздо менее распространенная, но тоже встречающаяся причина, поэтому и ее не стоит сбрасывать со счетов.
Виды
Любой такой баг можно условно отнести к одной из трех категорий:
- Возникает сразу при включении программы – обусловлен неправильным завершением предыдущего сеанса. Необходимо разбираться с кэшем.
- Проявляется по ходу действий, при выполнении какой-либо операции, допустим, при открытии каталога или проведении бланка. В этом случае проблема конкретно в той области, с которой взаимодействовало ПО, повреждена именно она.
- В штатном режиме неполадки отсутствуют, но при входе в «1С: Конфигуратор» ошибка формата потока не заставляет себя ждать (при осуществлении определенной операции). Здесь тоже всему виной cash – вопрос в нем.
От типа бага напрямую зависит и выбор варианта его устранения. Хотя можно поступить по-другому и поочередно пробовать все методы, пока какой-то не принесет результат, благо ни один из них не способен навредить системе или нарушить безопасность ПК. Но это стратегия для тех, у кого много свободного времени. Мы же советуем действовать более рационально: лучше потратить эти «лишние» полчаса на резервное архивирование – для бэкапа, на всякий случай – после чего проанализировать ситуацию, диагностировать проблему и решить ее с первой попытки.
Как устранить в 1С файловую ошибку формата потока
Единой и универсальной инструкции нет, зато есть несколько проверенных способов, полезных в зависимости от контекста. И хорошо, если перед тем, как браться за один из них, вы все-таки сохраните копию БД. После того как правильно продублируете ее на другой носитель (жесткий диск или флешку), предлагаем двигаться от простых и наиболее распространенных вариантов действий к тем, что посложее.
Интересно, что на более свежих версиях, чем 8.3, баг при входе в модули системы встречается уже значительно реже. Очевидно, что разработчик учитывает жалобы клиентов и пытается оградить их от неудобств, даже если они вызваны причинами, не напрямую зависящими от надежности или юзабилити ПО.
Почистить кэш 1С
Первое, логичное и очевидное решение – самостоятельно удалить все те файлы, что хотя бы теоретически могут быть повреждены, и (это важно) отсутствие которых никак не повлияет на работоспособность платформы. Нужно узнать, где же они хранятся, а потому:
Откройте приложение и посмотрите в левый нижний угол – в нем написан путь.
Перейдите по этому адресу в проводнике Windows и вручную уберите из каталога все элементы, кроме одного – папки 1Cv8 (после точки записывается его версия – в примере на скриншоте – 1CD).
Теперь остается снова попробовать запустить программу. Если проблема была в «битых» файлах, сообщения об ошибке не появится. В тех случаях, когда способ не сработал, необходимо попробовать другой.
Очистить cash базы 1С
Важно не путать с предыдущим методом – здесь характер воздействия более точечный. Для устранения ошибки при загрузке данных потока в 1C следует перейти к папкам хранения кэша. В ОС Windows 7 и выше они лежат здесь:
C:UsersUsernameAppDataRoaming1C
C:UsersUsernameAppDataLocal1C
Внимание, AppData может быть не видна – тогда потребуется настроить отображение скрытых папок; кроме того, по конечному адресу часто находится сразу много каталогов – вам нужны только те, что начинаются с «1Cv8».
Самый радикальный вариант – просто удалить эти элементы целиком, со всеми их вложениями:
Но мы предлагаем потратить чуть больше времени: зайдите еще и в них и уберите только папки с непонятными именами, состоящими из целой вереницы символов:
Так вы обезопасите себя от повреждений реестра, способных вылиться в какие-то другие проблемы.
Если же уведомление продолжает появляться, перейдите к следующему способу.
Запустить режим тестирования и исправления
Если у вас постоянно выскакивает ошибка формата потока данных 1С, Конфигуратор поможет ее устранить. Откройте его, кликните на вкладку «Администрирование» и там, в выпадающем меню нажмите на указанную на скриншоте строчку:
Откроется окно настроек – обязательно поставьте галочки напротив «реиндексация таблиц…» и «проверка логической целостности…», то есть возле двух первых пунктов; третий, касающийся ссылок, опционален – можете отметить и его, – а вот все последующие уже не нужны.
Система просмотрит БД, найдет существующие нарушения, исправит их и выдаст отчет, в котором будет написано, что за проблемы были выявлены и устранены. Способ хорош своей высокой степенью автоматизации – никаких ручных операций, – но он рассчитан на современные машины. Помните, в течение всего периода диагностики никаких других операций в приложении выполнять не получится. Слабым компьютерам потребуется достаточно много времени. Также этот вариант не всегда доступен, а значит, для подстраховки, стоит знать и следующий метод.
Запустить утилиту «chdbfl.exe»
Она становится настоящим спасением, когда вообще не открывается «1С: Предприятие 8», и ошибка формата потока высвечивается сразу при старте работы, не давая даже зайти в Конфигуратор.
Чтобы воспользоваться ей, перейдите по такому адресу в Проводнике Windows:
C:Program Files (x86)1Cv88.3…bin
Затем откройте исполнительный файл с расширением *exe от имени Администратора.
Поставьте галочку напротив пункта «Исправлять обнаруженные…» и подтвердите свой выбор, кликнув на «Выполнить».
Остальное сделает система: она проведет проверку, устранит все найденные нарушения, восстановит реестр и тому подобное, а также предоставит отчет с подробностями. Любые активные сеансы пользования программой при этом должны быть закрыты, чтобы не перегружать платформу и не влиять на результаты.
Рекомендуем повторить процедуру еще 2 раза – лучше, если таких прогонов будет в общей сложности 3. Потому что во время первого теста утилита может вообще не обнаружить повреждений и потерь файлов, но зато отыщет их потом, действуя в своеобразном фоновом режиме и не присылая уведомлений. И если вы приступите к работе сразу, то будете думать, что все в порядке, хотя проблема еще найдется, проявит себя в виде назойливого уведомления и не даст завершить важную операцию, например, сохранить заполненную форму.
Выгрузить/загрузить базу в .dt
Если произошла ошибка создания файлового потока, и ни одна из вышеописанных мер не помогает, можно сделать резервную копию БД и перейти на нее. Для этого:
Запустите Конфигуратор, выберите вкладку «Администрирование», а из выпадающего в ней списка – пункт «Выгрузить», как показано на скриншоте:
Укажите место записи (папку на диске), совместимое расширение (.dt) и подтвердите все это кликом на «Сохранить».
Сделайте на сервере или на своем ПК новую базу – естественно, она будет пустой. Поэтому зайдите в ее Конфигуратор, клацните на «Администрирование», а затем на «Загрузить…».
Выберите ранее созданный dt-массив и щелкните на «Открыть».
По сути, это простейшая операция экспорта-импорта, но она удобна сразу двумя вещами. Во-первых, вы автоматически почистите кэш, ведь система начнет использовать новый файл. Во-вторых, те индивидуальные настройки, которые вы ранее вносили под себя (шрифты, шаблоны и так далее) тоже перенесутся, их не придется задавать «с нуля».
Выгрузить/загрузить данные через XML
Если у 1С неверный формат потока, а конфигурация повреждена без возможности восстановления, придется переносить БД в чистую среду. Это наиболее сложный метод, рассчитанный даже не на опытных пользователей, а на специалистов техподдержки, потому браться за его реализацию стоит в самом крайнем случае.
Запустите модуль стандартной обработки – через «Главное меню», «Файл» и «Открыть», как показано на скриншоте, и задайте путь.
Появится форма – в ней поставьте птички напротив каждого типа данных и нажмите на «Выгрузить».
Система создаст XML-массив в указанной вами папке. Дальше останется только перейти в новую пустую БД и там, использовав эту же функцию, выполнить экспорт через вкладку «Загрузка», клик на кнопку со схожим названием и выбор ранее сохраненного файла.
Актуализировать систему
Это нужно делать тогда, когда компьютеры в рамках корпоративной сети используют ПО разных версий. Ошибка источника/приемника потока при обновлении 1С решается сразу же. Хотя сегодня она встречается все реже, потому что с 8.3.5 сеансы «более низких» платформ автоматически блокируются. Но если БД запустят на одной машине с софтом редакции 8.3.10 и на другой, с 8.3.4, то расхождения в процессе работы неизбежны. Правда, это тот момент, который не должен допускать, скорее, системный администратор, чем рядовые бухгалтеры.
Есть и иные способы – они сложнее, радикальнее, требуются реже, предполагают наличие глубоких знаний и подразумевают профессиональную ответственность за принятые решения и внесенные изменения. Потому просто перечислим их, без детального рассмотрения:
- отключение в реестре Windows протокола IPv6;
- переустановка программы с последующей настройкой;
- полный перенос БД на другой компьютер и запуск ее на том ПК;
- использование утилиты Tool_1CD;
- деактивация фаерволла и/или внесение исключений в антивирусную защиту;
- актуализация конфигурации через cf-файл.
И это еще не все из возможных вариантов решения. Если появилась ошибка загрузки документа, имеет смысл проверить жесткий диск ПК на наличие битых кластеров, для чего отлично подойдет утилита chkdsk.exe. Если базовые способы не возымели должного эффекта, ничто не мешает провести более глубокую диагностику и/или почистить кэш не только приложения, но и компьютера в целом.
Запуск БД на другой машине – это тоже своеобразная проверка. Если и там ничего не выйдет, значит, проблема не в операционке, и не в железе, а именно в повреждении каких-то конкретных элементов реестра. Но любое действие должно быть рациональным, и предпринимать его нужно лишь тогда, когда вы четко понимаете, как, что и зачем открываете, экспортируете, импортируете.
Есть сразу 5 проверенных способов устранения проблемы + обновление, его все-таки нужно считать отдельно, ведь это, по сути, обязательная процедура. Они помогут решить вопрос в 99% ситуаций, и надоедливое сообщение больше не будет мешать вашей работе. Оставшийся процент – сложные и нестандартные случаи, над которыми пусть задумываются системные администраторы и специалисты техподдержки разработчика.
Итог
Мы подробно описали распространенный баг, частенько возникающий как в процессе работы, так и при загрузке информационной базы 1С: ошибка формата потока – неприятное явление, но оно устраняется, причем без особого труда, и вы уже узнали, как это сделать. Теперь, когда одной проблемой стало меньше, можно еще эффективнее использовать многочисленные возможности платформы, особенно с теми вспомогательными программными продуктами для ведения учета и торговли, которые представлены в «Клеверенс», – обращайтесь для выгодного заказа полезного ПО.
Количество показов: 12825
2 января, 2015 12:50 пп
15 294 views
| Комментариев нет
Cloud Server
При обращении к веб-серверу или приложению каждый поступивший HTTP-запрос получает в качестве ответа код состояния HTTP (англ. HTTP status code). Коды состояния HTTP – это трехзначные коды, сгруппированные в пять различных классов. Класс кода состояния можно определить по первой цифре:
- 1хх – информационные коды;
- 2хх – успех;
- 3хх – перенаправление;
- 4хх – ошибка клиента;
- 5хх – ошибка сервера.
Это руководство фокусируется на выявлении и устранении наиболее часто встречающихся кодов ошибок HTTP (то есть кодов состояния 4xx и 5xx) с точки зрения системного администратора. В некоторых ситуациях веб-сервер отвечает на запрос определенным кодом ошибки; рассмотрим общие возможные причины и решения.
Краткий обзор ошибок клиента и сервера
Ошибки клиента (коды состояния HTTP 400-499) возникают из-за HTTP-запросов, отправленных клиентом (веб-браузером или другим клиентом HTTP). Хотя данные типы ошибок связаны непосредственно с клиентом, системному администратору полезно знать, с какими кодами ошибок может столкнуться пользователь, чтобы определить, можно ли решить эту проблему в конфигурациях сервера.
Ошибки сервера (коды состояния HTTP 500-599) возникают тогда, когда веб-сервер не в состоянии обработать запрос из-за какой-либо ошибки или сбоя.
Общие советы по устранению ошибок HTTP
- При использовании веб-браузера для тестирования веб-сервера не забудьте обновить браузер после внесения изменений в настройки сервера.
- Проверяйте логи сервера, чтобы получить подробные сведения о том, как сервер обрабатывает запросы. Например, веб-серверы Apache и Nginx создают два файла по имени access.log и error.log, в которых можно найти соответствующую информацию.
- Запомните: определения кодов состояния HTTP являются частью стандарта, который реализуется обслуживающим запросы приложением. Это означает, что фактический код состояния, который возвращается в результате, зависит от того, как программное обеспечение сервера обрабатывает конкретную ошибку.
Ознакомившись с основными понятиями кодов состояния HTTP, приступим к обзору наиболее часто встречающихся ошибок.
Ошибка 400 Bad Request
Код статуса 400, или ошибка Bad Request («неверный запрос») означает, что синтаксис запроса HTTP, отправленного на сервер, неверен.
Как правило, причины возникновения ошибки 400 Bad Request таковы:
- Куки пользователя, связанные с сайтом, повреждены. Чтобы решить эту проблему,, попробуйте очистить кэш браузера и файлы cookie.
- Искаженный запрос из-за неисправного браузера.
- Искаженный запрос из-за ошибки пользователя при формировании HTTP-запроса вручную (например, неправильное использование curl).
Ошибка 401 Unauthorized
Код статуса 401, или ошибка Unauthorized («неавторизован») значит, что пользователь, пытающийся получить доступ к ресурсу, не прошел авторизацию (или не смог пройти ее, указав неверные учетные данные). Чтобы иметь возможность просматривать защищенный ресурс, пользователь должен предоставить корректные учетные данные.
Например, ошибка 401 Unauthorized может возникнуть, если пользователь пытается получить доступ к ресурсу, который защищен HTTP-авторизацией (как в этом руководстве по Nginx). В подобной ситуации ошибка 401 будет появляться снова и снова до тех пор, пока пользователь не предоставит корректный логин и пароль (который внесен в файл .htpasswd).
Ошибка 403 Forbidden
Код состояния 403, или ошибка Forbidden («запрещено») значит, что запрос пользователя был отправлен верно, но сервер отказывается обслуживать его в связи с отсутствием разрешения на доступ к запрашиваемому ресурсу. В этом разделе описаны наиболее распространенные причины возникновения ошибки 403.
Права на файл
Как правило, ошибка 403 случается, если пользователь, который запускает процесс веб-сервера, не имеет прав на чтение запрашиваемого файла.
Чтобы привести пример устранения ошибки 403, предположим, что:
- пользователь пытается получить доступ к индексному файлу (http://example.com/index.html);
- рабочий процесс веб-сервера принадлежит пользователю www-data;
- индексный файл на сервере находится в /usr/share/nginx/html/index.html.
Итак, если пользователь получает ошибку 403 Forbidden, убедитесь, что пользователь www-data имеет права на чтение файла. Как правило, в подобной ситуации нужно просто изменить права на файл. Это можно сделать несколькими способами, но в данном случае подойдет вот эта команда:
sudo chmod o=r /usr/share/nginx/html/index.html
Файл .htaccess
Еще одна потенциальная причина возникновения ошибки 403 (часто это делается намеренно) – использование файла .htaccess. При помощи файла .htaccess можно запретить конкретным IP-адресам (или диапазонам адресов) доступ к определенным ресурсам.
Если пользователи неожиданно получают ошибку 403 Forbidden, убедитесь, что она не была вызвана настройками файла .htaccess.
Несуществующий индексный файл
Если пользователь пытается получить доступ к каталогу, который не имеет стандартного индексного файла, а листинг каталога (directory listing) отключен, веб-сервер будет возвращать ошибку 403 Forbidden. Такое случится, если, например, пользователь попытается получить доступ к каталогу http://example.com/emptydir/, а в каталоге emptydir на сервере нет индексного файла. Листинг каталога можно включить в конфигурациях сервера.
Ошибка 404 Not Found
Код статуса 404, или ошибка Not Found («не найдено») значит, что пользователь может взаимодействовать с сервером, но требуемый файл или ресурс отсутствует.
Ошибки 404 могут возникнуть в самых различных ситуациях. Ниже приведен список советов, которые помогут устранить проблему в случае, если пользователь неожиданно получил 404 Not Found:
- Проверьте ссылку, которая направляет пользователя на сервер, на наличие ошибок или опечаток.
- Возможно, пользователь ввел неверный URL.
- Может быть, нужного файла не существует в указанном месте на сервере; убедитесь, что запрашиваемый ресурс не был перемещен или удален с сервера.
- Проверьте, правильно ли указано местонахождение корневого каталога (document root) в конфигурации сервера.
- Возможно, пользователь, которому принадлежит рабочий процесс веб-сервера, не имеет соответствующих прав, чтобы открыть каталог, в котором находится запрашиваемый файл. Для доступа к каталогу нужны права на чтение и выполнение.
- Если пользователь переходит к ресурсу по символической ссылке, убедитесь, что веб-сервер настроен для поддержки символических ссылок.
Ошибка 500 Internal Server Error
Код состояния 500, или ошибка Internal Server Error («внутренняя ошибка сервера») означает, что сервер не может обработать запрос по неизвестной причине. Иногда этот код появляется в ситуациях, когда более подходящими являются другие сообщения об ошибках 5xx.
Как правило, причиной данной ошибки является неправильная настройка сервера (например, искаженный файл .htaccess) или нехватка некоторых пакетов (к примеру, запуск файла PHP без предварительно установленного PHP).
Ошибка 502 Bad Gateway
Код состояния 502, или ошибка Bad Gateway («ошибочный шлюз») значит, что запрашиваемый сервер является шлюзом или прокси-сервером, и он не получает валидных ответов от серверов бэкэнда, которые на самом деле выполнили запрос.
Если речь идет об обратном прокси-сервере (например, о балансировщике нагрузки), убедитесь, что:
- с серверами бэкэнда (на которые пересылаются HTTP-запросы) все в порядке;
- обратный прокси настроен правильно, в его настройках указаны корректные бэкэнды;
- сетевое соединение между серверами бэкэнда и обратным прокси-сервером в порядке. Если серверы могут взаимодействовать на других портах, убедитесь, что эти порты не заблокированы брандмауэром;
- нужные сокеты существуют в корректном местонахождении и имеют соответствующие разрешения (если веб-приложение настроено слушать сокеты).
Ошибка 503 Service Unavailable
Код состояния 503, или ошибка Service Unavailable («сервис недоступен») означает, что сервер перегружен или находится на обслуживании; такой сервис должен стать доступным в течение некоторого времени.
Если сервер не находится на обслуживании, эта ошибка может указывать на то, что серверу не хватает ресурсов процессора или памяти для обработки всех входящих запросов, или что нужно настроить веб-сервер для обслуживания большего количества пользователей или процессов.
Ошибка 504 Gateway Timeout
Код состояния 504, или ошибка Gateway Timeout («шлюз не отвечает») значит, что данный сервер является шлюзом или прокси-сервером, и он не получает ответа от бэкэнда в пределах допустимого периода времени.
Как правило, это происходит по следующим причинам:
- Плохое сетевое соединение между серверами;
- Внутренний сервер, который выполняет запрос, работает слишком медленно;
- В настройках сервера задано слишком короткое время ожидания шлюза или прокси-сервера.
Заключение
Теперь вы знакомы с основными кодами ошибок HTTP и знаете некоторые пути решения этих проблем.
Если же вы столкнулись с ошибкой, которая не была охвачена данной статьей, или знаете другие удобные способы устранения ошибок HTTP, пожалуйста, опишите их в комментариях ниже.
Tags: Cloud Server, HTTP, HTTP status code, VPS