您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 info
问题
客户端应用收到 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 请求 | 客户端向已配置 TLS 的虚拟主机发出 HTTP 请求 | Edge Public 和 Private Cloud 用户 |
| 向已配置 TLS 的目标端点发出 HTTP 请求 | 向目标端点中已启用 TLS 的后端服务器发出 HTTP 请求。 | Edge Public 和 Private Cloud 用户 |
| 目标服务器配置不正确 | 目标服务器配置了安全端口 443,但未启用 SSL。 |
Edge Public 和 Private Cloud 用户 |
原因:向已配置 TLS 的虚拟主机发出 HTTP 请求
当客户端尝试连接到 Apigee 上的 API,并且提及的 虚拟主机配置为使用 SSL 并收到 HTTP 请求时,就会发生此错误。
诊断
由于此问题发生在 北向端点上,并且 API 请求在 客户端应用与路由器之间的入口点交互处失败,因此这些错误消息不会记录在 NGINX 路由器 访问日志中。因此,这些请求不会在 API 监控和 跟踪工具等工具中捕获。
-
验证您的 API 请求,看看您是否为配置为仅接受安全端口
443上的请求的主机别名发出 HTTP 请求。如果是,则 会导致此问题。不正确的 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>
- 在上面的示例请求中,请注意,系统会向安全端口
443上的主机别名myorg-test.apigee.net发出 HTTP 请求。这会导致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
原因:向已配置 TLS 的目标端点发出 HTTP 请求
如果您错误地将 HTTP 请求配置为 API 代理的目标端点中已启用 TLS 的后端 服务器,则会发生此错误。
诊断
请按照以下步骤使用跟踪工具诊断错误:
- 在 Apigee 界面中为受影响的 API 代理启用 Trace 。
- 向 API 代理发出请求。
- 选择一个失败的 API 请求,该请求的响应代码为
400。 - 浏览各个阶段,确定失败发生的位置。
-
通常,您会看到来自后端服务器的
400错误响应。 也就是说,您会在收到的响应 从目标服务器 阶段看到400错误响应,如下所示:
-
点击跟踪记录中的 AX (记录的分析数据)图标,确定发出请求的目标端点。

- 记下 target.url,其中包含协议、后端服务器主机别名,
有时还包含端口号。用于目标网址的
端口为
443,但协议为 HTTP。 - 查看目标端点的定义,了解配置。
-
验证后端服务器主机是否安全,并且是否监听安全端口(例如
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.
分辨率
-
如果您的后端服务器是安全的/已启用 TLS,请确保在目标端点的
<URL>元素中使用协议作为https,如以下示例所示:目标端点配置示例:
<HTTPTargetConnection> <Properties/> <URL>https://somehost.org:443/get</URL> </HTTPTargetConnection> -
如果您的后端服务器不安全,请执行以下操作:
- 请勿提及安全端口号,例如
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 的消息处理器向安全或
已配置 TLS 的目标服务器发送 HTTP 请求,从而导致此问题。
诊断
请按照以下步骤使用跟踪工具诊断错误:
- 在 Apigee 界面中为受影响的 API 代理启用 Trace 。
- 向 API 代理发出请求。
- 选择一个失败的 API 请求,该请求的响应代码为
400。 - 浏览各个阶段,确定失败发生的位置。
-
通常,您会看到来自后端服务器的
400错误响应。 也就是说,您会在从目标服务器收到的响应 阶段看到400错误响应,如下所示:
-
点击跟踪记录中的 AX (记录的分析数据)图标,确定发出请求的目标端点。

-
记下 target.name,它表示目标端点名称。
在上面的示例跟踪文件中,target.name 为 default 。这表示 用于此请求的目标端点是默认端点。
-
查看目标端点的定义,了解配置。
目标端点配置示例:
<?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. -
获得目标服务器名称后,您可以使用以下方法之一来 检查目标服务器配置:
- Edge 界面
- Management API
Edge 界面
- 前往 Apigee Edge > 管理 > 环境 > 目标服务器 。
- 选择从 API 代理中标识的特定目标服务器,然后点击 修改。
- 验证为目标服务器指定的端口和 SSL 信息。
-
如果目标服务器配置了安全端口(例如
443), 但未启用 SSL,则会导致此问题。
如上图所示,使用的端口为
443,但在目标服务器配置中未为该端口启用 SSL。这会导致 Apigee Edge 的消息 处理器向安全端口443发送 HTTP 请求。因此,您会收到 错误400 Bad Request,并显示消息The plain HTTP request was sent to HTTPS port.
Management API
-
执行 Get target server API 以获取有关特定目标服务器配置的详细信息 ,如下所示:
Public Cloud 用户:
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"
- 验证为目标服务器指定的端口和 SSL 信息。
-
如果目标服务器配置了安全端口(例如
443),但 未定义或启用SSLInfo部分,则会导致此问题。目标服务器配置示例:
{ "host" : "somehost.org", "isEnabled" : true, "name" : "faulty-target", "port" : 443 }在上面的示例输出中,我们可以看到用于目标连接的端口为
443,但没有SSLInfo配置块。这会导致 Apigee Edge 的消息处理器向安全端口
443发送 HTTP 请求。因此,您会收到错误400 Bad Request,并显示消息The plain HTTP request was sent to HTTPS port.
分辨率
如果您的目标服务器是安全的或已配置 TLS,则需要为特定 目标服务器启用 SSL。
您可以使用以下选项之一来执行此操作:
- Edge 界面
- Management API
Edge 界面
- 前往 Edge 界面 > 管理 > 环境 > 目标服务器 上的目标服务器。
- 选择特定目标服务器,然后点击 修改。
- 如果您的目标服务器是安全的并且使用端口(例如
443),请选中 SSL 选项旁边的复选框以启用 SSL。 - 配置 Truststore、Ciphers 和 Protocols。(仅在需要时)
Management API
使用 Management API 配置目标服务器,如 更新目标服务器配置文档中所述。
必须收集的诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下 诊断信息,然后联系 Apigee Edge 支持团队。
- 如果您是 Public Cloud 用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 用于重现错误的完整 curl 命令
- 跟踪工具输出(如果您能够捕获失败请求的输出)
- 如果您是 Private Cloud 用户,请提供以下信息:
- 观察到的完整错误消息
- 环境名称
- API 代理软件包
- 目标服务器定义(如果您在端点中使用目标服务器)
- 跟踪工具输出(如果您能够捕获失败请求的输出)