<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 监控和工具不会捕获这些请求, 跟踪工具
-
请验证您的 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>
- 请注意,在上述示例请求中,系统会向主机别名
安全端口
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">按照以下步骤使用跟踪工具诊断错误:
- 在 Apigee 界面中为受影响的 API 代理启用 Trace。
- 向 API 代理发出请求。
- 选择其中一个失败且返回
400
响应代码的 API 请求。 - 浏览各个阶段并确定故障发生位置。
-
通常,您会看到来自后端服务器的
400
错误响应。 也就是说,您会在 Response received 阶段看到400
错误响应 从目标服务器配置,如下所示: -
点击 AX,确定发出请求的目标端点 (跟踪记录中记录的 Google Analytics 数据)图标。
- 请注意 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>
<ph type="x-smartling-placeholder"> -
如果您的后端服务器为非安全服务器,则:
- 请勿提及安全端口号,例如
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">按照以下步骤使用跟踪工具诊断错误:
- 在 Apigee 界面中为受影响的 API 代理启用 Trace。
- 向 API 代理发出请求。
- 选择其中一个失败且返回
400
响应代码的 API 请求。 - 浏览各个阶段并确定故障发生位置。
-
通常,您会看到来自后端服务器的
400
错误响应。 也就是说,您会在收到响应的阶段中看到400
错误响应 从目标服务器配置,如下所示: -
点击 AX,确定发出请求的目标端点 (跟踪记录中记录的 Google Analytics 数据)图标。
-
请注意 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 的消息 将 HTTP 请求发送到安全端口443
的处理器。因此,您可以获得 错误400 Bad Request
,错误消息为The plain HTTP request was sent to HTTPS port
。
Management API
-
执行 <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"
- 验证为目标服务器指定的端口和 SSL 信息。
-
如果目标服务器配置了安全端口(例如:
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 界面
- 在 Edge UI >管理 >环境 >目标服务器。
- 选择特定的目标服务器,然后点击 修改。
- 如果您的目标服务器是安全的并且使用
443
等端口,请通过以下方式启用 SSL: 选中 SSL 选项旁边的复选框。 - 配置Truststore、Truststore和Truststore。(仅在需要时)
Management API
按照 <ph type="x-smartling-placeholder"></ph> 更新目标服务器配置文档。
必须收集的诊断信息
按照上述说明操作后,如果问题依然存在,请收集以下内容 然后联系 Apigee Edge 支持团队。
- 如果您是公有云用户,请提供以下信息:
<ph type="x-smartling-placeholder">
- </ph>
- 组织名称
- 环境名称
- API 代理名称
- 完整 curl 命令以重现该错误
- 跟踪工具输出(如果能够捕获失败请求的情况)
- 如果您是 Private Cloud 用户,请提供以下信息:
<ph type="x-smartling-placeholder">
- </ph>
- 观察到完整的错误消息
- 环境名称
- API 代理软件包
- 目标服务器定义(如果您在端点中使用目标服务器)
- 跟踪工具输出(如果能够捕获失败请求的情况)