400 请求错误 - 向 HTTP 端口发送的普通 HTTP 请求

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

客户端应用收到 HTTP 400 Bad Request 响应,其中包含以下消息 The plain HTTP request was sent to HTTPS port

错误消息

客户端应用将获得以下响应代码:

HTTP/1.1 400 Bad Request

后跟以下 HTML 错误页面:

<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
</body>
</html>

可能的原因

原因 说明 适用的问题排查说明
向配置 TLS 的虚拟主机发出的 HTTP 请求 客户端将 HTTP 请求发送到配置 TLS 的虚拟主机 Edge 公有云和私有云用户
发送到配置 TLS 的目标端点的 HTTP 请求 向目标端点中已启用 TLS 的后端服务器发出的 HTTP 请求。 Edge 公有云和私有云用户
目标服务器配置不正确 目标服务器配置了安全端口 443,但未启用 SSL。 Edge 公有云和私有云用户

原因:向配置 TLS 的虚拟主机发出 HTTP 请求

当客户端尝试连接到 Apigee 上的 API 并且 将虚拟主机配置为使用 SSL 并改为接收 HTTP 请求。

诊断

由于此问题发生在 <ph type="x-smartling-placeholder"></ph> 北向端点,而 API 请求在 客户端应用和路由器,那么这些错误消息不会记录在 NGINX 路由器中 访问日志。因此,API 监控和工具不会捕获这些请求, 跟踪工具

  1. 请验证您的 API 请求,看看您是不是针对 配置为仅接受安全端口 443 上的请求。如果有,那么 这就是问题的根本原因

    错误 API 请求示例

    curl http://org-test.apigee.net:443/400-demo
    
    <html>
    <head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
    <body>
    <center><h1>400 Bad Request</h1></center>
    <center>The plain HTTP request was sent to HTTPS port</center>
    <hr><center>server</center>
    </body>
    </html>
    
  2. 请注意,在上述示例请求中,系统会向主机别名 安全端口 443 上的 myorg-test.apigee.net。这就是导致 400 Bad Request 个错误。

分辨率

您需要验证客户端使用的是 HTTP 而不是 HTTPS,并发出正确的请求,如下所示: 如下所示:

示例 API 请求

curl https://org-test.apigee.net:443/400-demo

curl https://org-test.apigee.net/400-demo
< HTTP/1.1 200 OK
< Date: Thu, 25 Feb 2021 13:01:43 GMT
< Content-Type: text/xml;charset=UTF-8
< Content-Length: 403
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<ph type="x-smartling-placeholder">

原因:向配置 TLS 的目标端点发送 HTTP 请求

如果错误地将 HTTP 请求配置到启用了 TLS 的后端,就会出现此错误 位于 API 代理的目标端点中。

诊断

<ph type="x-smartling-placeholder">

按照以下步骤使用跟踪工具诊断错误:

  1. 在 Apigee 界面中为受影响的 API 代理启用 Trace
  2. 向 API 代理发出请求。
  3. 选择其中一个失败且返回 400 响应代码的 API 请求。
  4. 浏览各个阶段并确定故障发生位置。
  5. 通常,您会看到来自后端服务器的 400 错误响应。 也就是说,您会在 Response received 阶段看到 400 错误响应 从目标服务器配置,如下所示:

  6. 点击 AX,确定发出请求的目标端点 (跟踪记录中记录的 Google Analytics 数据)图标。

  7. 请注意 target.url,其中包含协议、后端服务器主机别名 有时是端口号用于 目标网址为 443,但协议为 HTTP。
  8. 查看目标端点的定义,了解配置。
  9. 验证后端服务器主机是否安全,以及是否通过安全端口(如 443)进行监听。 如果您在 <URL> 元素中将协议用作 http,则 这就是导致这一问题的原因。

    目标端点配置示例

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TargetEndpoint name="default">
        <Description/>
        <FaultRules/>
        <PreFlow name="PreFlow">
            <Request/>
            <Response/>
        </PreFlow>
        <PostFlow name="PostFlow">
            <Request/>
            <Response/>
        </PostFlow>
        <Flows/>
        <HTTPTargetConnection>
            <Properties/>
            <URL>http://somehost.org:443/get</URL>
        </HTTPTargetConnection>
    </TargetEndpoint>
    

    上例显示,您使用的是 HTTP 协议,但所用的端口是安全的 端口 443。这会导致后端服务器 400 Bad Request 和错误消息 The plain HTTP request was sent to HTTPS port

分辨率

  1. 如果您的后端服务器安全/启用了 TLS,请确保使用协议作为 目标端点的 <URL> 元素中的 https,如下所示 请参阅以下示例:

    目标端点配置示例

    <HTTPTargetConnection>
        <Properties/>
        <URL>https://somehost.org:443/get</URL>
    </HTTPTargetConnection>
    
    <ph type="x-smartling-placeholder">
  2. 如果您的后端服务器为非安全服务器,则:

    • 请勿提及安全端口号,例如 443
    • 如果您的后端服务器监听 标准非安全端口
    • 如果您使用的是任何其他非安全端口,请注明端口号,例如: 9080

    目标端点配置示例

    <HTTPTargetConnection>
        <Properties/>
        <URL>http://somehost.org/get</URL>
    </HTTPTargetConnection>
    
    or
    
    <HTTPTargetConnection>
        <Properties/>
        <URL>http://somehost.org:9080/get</URL>
    </HTTPTargetConnection>
    

原因:目标服务器配置不正确

如果目标服务器配置了安全端口(如 443),但未启用 SSL,那么它会使 Apigee Edge 的消息处理器将 HTTP 请求发送到安全或 导致此问题的 TLS 配置的目标服务器。

诊断

<ph type="x-smartling-placeholder">

按照以下步骤使用跟踪工具诊断错误:

  1. 在 Apigee 界面中为受影响的 API 代理启用 Trace
  2. 向 API 代理发出请求。
  3. 选择其中一个失败且返回 400 响应代码的 API 请求。
  4. 浏览各个阶段并确定故障发生位置。
  5. 通常,您会看到来自后端服务器的 400 错误响应。 也就是说,您会在收到响应的阶段中看到 400 错误响应 从目标服务器配置,如下所示:

  6. 点击 AX,确定发出请求的目标端点 (跟踪记录中记录的 Google Analytics 数据)图标。

  7. 请注意 target.name,它表示目标端点名称。

    在上面的示例跟踪文件中,target.namedefault。这表示 用于此请求的目标端点是默认端点。

  8. 查看目标端点的定义,了解配置。

    目标端点配置示例

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TargetEndpoint name="default">
        <Description/>
        <FaultRules/>
        <PreFlow name="PreFlow">
            <Request/>
            <Response/>
        </PreFlow>
        <PostFlow name="PostFlow">
            <Request/>
            <Response/>
        </PostFlow>
        <Flows/>
        <HTTPTargetConnection>
            <Properties/>
            <LoadBalancer>
            <Server name="faulty-target"/>
            </LoadBalancer>
        </HTTPTargetConnection>
    </TargetEndpoint>
    

    上面的目标端点配置示例显示您使用的是目标服务器 名为 faulty-target

  9. 获得目标服务器名称后,您可以使用以下方法之一 检查目标服务器配置:

    • Edge 界面
    • Management API

Edge 界面

  1. 导航到 Apigee Edge >管理 >环境 >目标服务器
  2. 选择从 API 代理识别出的特定目标服务器,然后点击 修改
  3. 验证为目标服务器指定的端口和 SSL 信息。
  4. 如果目标服务器配置了安全端口(例如:443),则: 但没有启用 SSL,那么这就是导致此问题的原因。

    如以上屏幕截图所示,使用的端口为 443,但 SSL 并非 在目标服务器配置中针对该端口启用。这会导致 Apigee Edge 的消息 将 HTTP 请求发送到安全端口 443 的处理器。因此,您可以获得 错误 400 Bad Request,错误消息为 The plain HTTP request was sent to HTTPS port

Management API

  1. 执行 <ph type="x-smartling-placeholder"></ph> 获取目标服务器 API,以获取有关特定目标服务器配置的详细信息 如下所示:

    公有云用户

    curl -v 'https://api.enterprise.apigee.com/v1/organizations/ORG_NAME/environments/ENV_NAME>/targetservers/TARGET_SERVER_NAME' \
    -H "Content-Type:application/xml" \
    -H "Authorization:Bearer $TOKEN"
    

    Private Cloud 用户

    curl -v 'http://MANAGEMENT_IP:8080/v1/organizations/ORG_NAME/environments/ENV_NAME/targetservers/TARGET_SERVER_NAME' \
    -H "Content-Type:application/xml" \
    -H "Authorization:Bearer $TOKEN"
    
  2. 验证为目标服务器指定的端口和 SSL 信息。
  3. 如果目标服务器配置了安全端口(例如:443),但 SSLInfo 部分未定义或未启用,则会导致 问题。

    目标服务器配置示例

    {
      "host" : "somehost.org",
      "isEnabled" : true,
      "name" : "faulty-target",
      "port" : 443
    }
    

    在以上示例输出中,我们可以看到用于目标连接的端口是 443,但没有 SSLInfo 配置块。

    这会使 Apigee Edge 的消息处理器将 HTTP 请求发送到安全端口 443。因此,您会收到 400 Bad Request 错误信息 The plain HTTP request was sent to HTTPS port

分辨率

如果您的目标服务器是安全的或已配置 TLS,则需要为指定的 目标服务器。

您可以使用以下选项之一执行此操作:

  • Edge 界面
  • Management API

Edge 界面

  1. Edge UI >管理 >环境 >目标服务器
  2. 选择特定的目标服务器,然后点击 修改
  3. 如果您的目标服务器是安全的并且使用 443 等端口,请通过以下方式启用 SSL: 选中 SSL 选项旁边的复选框。
  4. 配置TruststoreTruststoreTruststore。(仅在需要时)

Management API

按照 <ph type="x-smartling-placeholder"></ph> 更新目标服务器配置文档。

必须收集的诊断信息

按照上述说明操作后,如果问题依然存在,请收集以下内容 然后联系 Apigee Edge 支持团队

  1. 如果您是公有云用户,请提供以下信息: <ph type="x-smartling-placeholder">
      </ph>
    • 组织名称
    • 环境名称
    • API 代理名称
    • 完整 curl 命令以重现该错误
    • 跟踪工具输出(如果能够捕获失败请求的情况)
  2. 如果您是 Private Cloud 用户,请提供以下信息: <ph type="x-smartling-placeholder">
      </ph>
    • 观察到完整的错误消息
    • 环境名称
    • API 代理软件包
    • 目标服务器定义(如果您在端点中使用目标服务器)
    • 跟踪工具输出(如果能够捕获失败请求的情况)