При переносе информационных баз 1С:Предприятие с Windows на Linux (в частности, на CentOS 7) разработчики часто сталкиваются с тем, что корректно работавшие ранее HTTP-сервисы начинают возвращать ошибку 1C:Enterprise 8 application error: The HTTP header contains invalid characters. Особенно критично это проявляется при попытке передать данные через Apache 2.4. В этой статье мы подробно разберем, почему возникает эта проблема, как ее диагностировать и какие шаги предпринять для успешного решения.
Рассмотрим типичную ситуацию: у нас есть самописный HTTP-сервис, развернутый на платформе 1С версии 8.3.10 (или аналогичных версиях ветки 8.3) под управлением Apache 2.4 на CentOS 7. При обращении к сервису клиент получает ошибку, указывающую на невалидные символы в заголовке, например: [ Content-Length: 158]. Обратите внимание на лишний пробел перед названием заголовка внутри квадратных скобок — это ключевая улика.
Проанализируем причины такой строгой реакции сервера. В отличие от реализаций на Windows, веб-сервер Apache в Linux-системах (начиная с версий 2.4.25+) по умолчанию придерживается строгой политики соблюдения стандартов RFC 7230. Если модуль расширения 1С (wsap24.so) формирует HTTP-пакет с малейшим отклонением от стандарта (лишний пробел, некорректный перенос строки \r\n), Apache блокирует такой ответ и возвращает ошибку 400.
Выясним основную причину сбоя, опираясь на практический опыт. Часто разработчики используют нестандартные или шуточные коды состояния, такие как 418 I'm a teapot, для обозначения специфических ошибок бизнес-логики. Выяснилось, что старые версии модуля wsap24.so для Linux при использовании кода 418 формируют некорректную «строку состояния» (Reason Phrase). Из-за отсутствия стандартного описания этого кода в библиотеках модуля, заголовок дополняется «мусорными» символами или лишними пробелами.
Для решения проблемы необходимо заменить нестандартные коды на общепринятые из спецификации HTTP/1.1. Разберем пример кода 1С, который может вызывать ошибку, и его исправленный вариант:
Проблемный вариант:
Ответ = Новый HTTPСервисОтвет(418); // Код 418 вызывает ошибку заголовков на Linux
Ответ.УстановитьТелоИзСтроки("Ошибка обработки данных");
Возврат Ответ;
Рекомендуемый вариант:
Ответ = Новый HTTPСервисОтвет(400); // Используем стандартный код Bad Request
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Тело = Новый Структура;
Тело.Вставить("описание", "В запросе отсутствуют обязательные поля");
// Формируем JSON вручную или через ЗаписьJSON
// ...
Возврат Ответ;
Использование стандартных кодов (400, 403, 404, 500) гарантирует, что модуль 1С корректно сформирует заголовки, понятные для Apache.
Если изменение программного кода невозможно или требуется временное решение, мы можем настроить сам веб-сервер так, чтобы он был менее требователен к чистоте заголовков. Для этого используется директива HttpProtocolOptions.
Проанализируем файл конфигурации httpd.conf (в CentOS он обычно находится в /etc/httpd/conf/httpd.conf). Нам нужно добавить или изменить следующую настройку:
# Позволяет Apache игнорировать некоторые ошибки в HTTP-заголовках,
# генерируемых модулями расширения (например, 1С)
HttpProtocolOptions Unsafe
Важно: Установка значения Unsafe снижает защищенность сервера перед атаками типа «HTTP Response Smuggling», поэтому этот метод стоит рассматривать как крайнюю меру. После внесения изменений не забудьте перезапустить службу: systemctl restart httpd.
Работа модуля wsap24.so сильно зависит от системной локали. Если сервер настроен на кодировку, отличную от UTF-8, преобразование строк в заголовках может происходить с ошибками. Проверим настройки окружения процесса httpd в CentOS.
Откроем файл /etc/sysconfig/httpd и добавим (или раскомментируем) строку, устанавливающую русскую или английскую UTF-8 локаль:
LANG=ru_RU.UTF-8
Это гарантирует, что модуль 1С будет использовать правильные символы при формировании служебных полей HTTP.
В ОС CentOS 7 активная система SELinux может блокировать сетевые взаимодействия Apache. Даже если вы видите ошибку заголовков, она может быть следствием того, что Apache не смог корректно считать библиотеки 1С или обратиться к сокету rphost. Проанализируем это, временно переведя SELinux в режим уведомлений:
setenforce 0.SELinux для httpd_t.setenforce 1.Также убедимся, что у пользователя, от имени которого запущен Apache (обычно apache), есть права на выполнение (x) всех каталогов в пути установки 1С и права на чтение файлов библиотек .so.
Подводя итог, можно сказать, что ошибка «The HTTP header contains invalid characters» в связке 1С + Linux чаще всего является следствием избыточной строгости Apache к результатам работы модуля 1С. Основные способы решения:
HttpProtocolOptions Unsafe в конфигурации веб-сервера.Content-Type.Следуя этим шагам, мы сможем обеспечить стабильную работу HTTP-сервисов 1С в высокопроизводительных средах на базе Linux.