Перейти к содержимому

1С не может прочитать ответ сайта - разбор причин

Учётная система жалуется, что не может разобрать ответ сайта, и обмен обрывается на первом же шаге. Разбираем причины по убыванию частоты.

С чего начать

Смотрим, что именно отдаёт точка обмена:

Окно терминала
curl -sS -u 'exchange:пароль' -D - -o /tmp/answer.txt \
'https://example.com/bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth'
head -c 200 /tmp/answer.txt | od -c | head -5
# первые байты ответа: там должно быть слово success, и ничего перед ним
grep -n 'success' /tmp/answer.txt | head -3
# служебное слово не на первой строке означает лишний вывод выше

Ответ точки обмена - это несколько строк служебного текста. Любой лишний байт перед ними ломает разбор, и учётная система сообщает об этом одинаково для всех причин сразу.

Ищем посторонний вывод в своём коде:

Окно терминала
grep -rlP '^\xEF\xBB\xBF' /home/bitrix/www/local/ /home/bitrix/www/bitrix/php_interface/
# метка кодировки в начале файла попадает в любой ответ сайта
tail -20 /home/bitrix/www/bitrix/php_interface/init.php
# пустая строка после закрывающего тега тоже уходит в ответ

Метка кодировки и пробелы вокруг закрывающего тега уходят в ответ раньше служебных строк. Тот же эффект дают предупреждения PHP, если их вывод на экран включён на боевом сайте.

Проверяем переходы и коды ответа:

Окно терминала
curl -sIL 'http://example.com/bitrix/admin/1c_exchange.php' | grep -E 'HTTP/|location'
# учётная система за переходами не идёт: адрес должен отвечать сразу
tail -20 /var/log/nginx/error.log | grep -i exchange
# отказы веб-сервера видны здесь, а не в журнале обмена

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

Причины

  1. Посторонний вывод перед ответом примерно 30% случаев

    ПризнакВ ответе перед служебным словом видны лишние байты или текст ошибки.

    ПроверкаСмотрим первые байты ответа и ищем метку кодировки в подключаемых файлах.

    Что делатьУбираем метку кодировки и закрывающие теги в конце файлов, выключаем вывод предупреждений.

  2. Точка обмена отвечает переходом примерно 25% случаев

    ПризнакОтвет содержит код перехода на другой адрес вместо служебных строк.

    ПроверкаЗапрашиваем адрес точки обмена и смотрим цепочку ответов до конечного.

    Что делатьПрописываем в узле сразу конечный адрес с нужным протоколом и написанием домена.

  3. Веб-сервер отказал в обработке примерно 20% случаев

    ПризнакВ ответе код отказа: запрет доступа, слишком большое тело запроса или ошибка шлюза.

    ПроверкаСмотрим журналы веб-сервера в момент сеанса обмена и предел размера тела запроса.

    Что делатьПоднимаем предел размера тела, снимаем защитные правила с адреса точки обмена.

  4. Не проходит доступ к точке обмена примерно 15% случаев

    ПризнакОтвет содержит форму входа вместо служебного текста.

    ПроверкаПроверяем учётную запись обмена, её права и ограничения по адресу.

    Что делатьВыдаём права на обмен, снимаем двухэтапный вход и ограничение по адресу для этой записи.

  5. Кодировка ответа не та примерно 10% случаев

    ПризнакСлужебные строки в ответе есть, но выглядят набором нечитаемых символов.

    ПроверкаСверяем кодировку сайта с кодировкой, заданной в настройках узла обмена.

    Что делатьПриводим настройку узла к кодировке сайта: обе стороны должны говорить в одной.

Частые вопросы

Как проверить точку обмена без учётной системы?

Запросом из консоли с логином и паролем обмена. Ответ должен начинаться служебным словом и не содержать разметки.

Почему обмен работал и перестал?

Чаще всего после правки кода или включения правила перехода на сервере. Оба изменения попадают в ответ точки обмена.

Можно ли смотреть ответ в журнале обмена?

Да, при включённом протоколировании он пишется целиком. Это самый быстрый способ увидеть лишний вывод.

Мешает ли защита от ботов?

Да, если она проверяет запросы к административной части. Адрес точки обмена из таких проверок исключают.

Смежное

Первоисточник