Назад | Перейти на главную страницу

Почему я получаю сообщение об ошибке 400 BAD REQUEST для простого запроса GET?

Я использую старый язык программирования (Adobe Extendscript). Он имеет простой объект Socket для отправки запросов TCP / IP. У меня всегда работали следующие строки:

reply = "";
conn = new Socket;
if (conn.open ("www.freelancebookdesign.com:80")) {
    conn.write ("GET /license.txt HTTP/1.1\nhost: freelancebookdesign.com\n\n");
    reply = conn.read(9999);
    conn.close();
}

Но пару дней назад моя хостинговая компания (Bluehost) перенесла мой веб-сайт в новый ящик (без запроса и предварительного предупреждения). Теперь те же строки выше возвращают следующую ошибку 400:

HTTP/1.1 400 Bad Request
Date: Thu, 02 Jul 2020 10:14:48 GMT
Server: Apache
Upgrade: h2,h2c
Connection: Upgrade, close
Accept-Ranges: bytes
host-header: c2hhcmVkLmJsdWVob3N0LmNvbQ==
Content-Length: 130
Content-Type: text/html; charset=UTF-8

Я связался с их службой поддержки, но получил бессмысленный ответ. Я не знаю, подходящее ли это место, чтобы попросить о помощи, но я был бы очень признателен, если бы у кого-нибудь были идеи, в чем может быть проблема, даже если я могу просто дать их службе поддержки несколько указателей в правильном направлении. В чем может быть разница между старой настройкой сервера и новой, которая может вызвать это?

Согласно заголовкам ответа, целевой сервер хочет, чтобы вы говорили по протоколу HTTP 2.0, как указано

Upgrade: h2,h2c
Connection: Upgrade, close

Я думаю, было бы лучше (и легче понять), если бы сервер отправил ошибку 426 (требуется обновление), но все же заголовки предполагают, что вы должны передать HTTP 2.0 серверу, поэтому ваш старый скрипт не будет работать.

Но пару дней назад моя хостинговая компания (Bluehost) перенесла мой веб-сайт в новый ящик (без запроса и предварительного предупреждения). Теперь те же строки выше возвращают следующую ошибку 400:

Это всего лишь догадка, но: теперь ваш сайт может быть размещен на другом наборе IP-адреса. Вполне возможно, что ваше приложение все еще пытается подключиться к предыдущему IP-адресу (ам) из-за кэшированной записи или записи в вашем файле хостов, минуя обычное разрешение DNS. В этом случае вам необходимо обновить записи DNS для вашего доменного имени.

Вопрос (и ответ) в конце оказываются идентичными этому: https://stackoverflow.com/questions/43574428/have-apache-accept-lf-vs-crlf-in-request-headers

Другими словами, Adobe Extendscript Socket преобразует любые последовательности \ r \ n в простые \ n (это фактически упоминается в документации объекта Socket), если кодировка объекта Socket не установлена ​​на двоичную. В какой-то момент серверы Apache перестали распознавать \ n в заголовках запросов и потребовали \ r \ n. Изменение HttpProtocolOptions на Unsafe не подходит для общего хостинга, и мой провайдер не хотел этого делать. Поэтому единственный ответ - переписать исходный код, установив кодировку Binary.