为什么我简单的 GET 请求会收到 400 BAD REQUEST 错误?

为什么我简单的 GET 请求会收到 400 BAD REQUEST 错误?

我使用的是旧编程语言(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

我联系了他们的客服,但得到的回复毫无头绪。我不知道这里是不是寻求帮助的正确地方,但如果有人知道问题可能出在哪里,我将不胜感激,即使我只能给他们的客服一些正确的指导。旧服务器设置和新服务器设置之间的区别是什么,这可能导致这种情况?

答案1

根据响应标头,目标服务器希望您使用 HTTP 2.0,如下所示

Upgrade: h2,h2c
Connection: Upgrade, close

我认为如果服务器发送 426(需要升级)错误会更好(并且更容易理解),但是标头仍然建议您应该与服务器使用 HTTP 2.0,因此您的旧脚本将无法运行。

答案2

但几天前,我的托管公司 (Bluehost) 将我的网站迁移到了一个新的主机上(没有被要求这样做,也没有提前警告)。现在上面的相同行返回以下 400 错误:

这只是一种预感,但:您的网站现在可能托管在不同的IP 地址。可以想象,由于缓存记录或 hosts 文件中的条目,您的应用程序仍在尝试连接到以前的 IP 地址,从而绕过正常的 DNS 解析。如果是这种情况,您需要更新域名的 DNS 记录。

答案3

问题(和答案)最终与此相同:https://stackoverflow.com/questions/43574428/have-apache-accept-lf-vs-crlf-in-request-headers

换句话说,除非 Socket 对象的编码设置为二进制,否则 Adob​​e 的 Extendscript Socket 会将任何 \r\n 序列转换为纯 \n(这实际上在 Socket 对象的文档中提到过)。在某个时候,Apache 服务器停止识别请求标头中的 \n 并要求 \r\n。将 HttpProtocolOptions 更改为 Unsafe 不是共享托管的选项,我的提供商不愿意这样做。因此,唯一的答案是通过将编码设置为二进制来重写原始代码。

相关内容