应用程序网关中的 HTTP 响应代码

本文描述了 Azure 应用程序网关返回特定 HTTP 响应代码的原因。 其中提供了常见原因和故障排除步骤,以帮助你确定错误 HTTP 响应代码的根本原因。 无论是否启动了与后端目标的连接,都可以将 HTTP 响应代码返回给客户端请求。

3XX 响应代码(重定向)

若客户端请求与已配置重定向的应用程序网关规则匹配,则显示 300-399 响应。 可以在原规则上或通过路径映射规则配置重定向。 有关重定向的详细信息,请参阅应用程序网关重定向概述

301 永久性重定向

使用 Permanent 值指定重定向规则时,会显示 HTTP 301 响应。

302 已找到

使用 Found 值指定重定向规则时,会显示 HTTP 302 响应。

303 参见其他

使用 See Other 值指定重定向规则时,会显示 HTTP 302 响应。

307 临时重定向

使用 Temporary 值指定重定向规则时,会显示 HTTP 307 响应。

4XX 响应代码(客户端错误)

400-499 响应代码表示从客户端发起的问题。 从客户端发起请求到主机名不匹配、请求超时、未经身份验证的请求、恶意请求等,这些问题涉及的范围十分广泛。

Azure 应用程序网关会收集获取 4xx/5xx 状况代码分布的日志记录机制,该机制会捕获具有响应代码的 URI 客户端 IP 地址等信息。 指标和日志记录让进一步排除故障成为可能。 客户端还可以从客户端设备和应用程序网关之间的其他代理接收 4xx 响应。 例如,CDN 和其他身份验证提供程序。 有关详细信息,请参阅以下文章。

应用程序网关 V2 SKU 支持的指标诊断步骤

400 - 错误的请求

HTTP 400 响应代码通常在以下情况出现:

  • 向具有 HTTP 或 HTTPS 侦听器的应用程序网关发起非 HTTP/HTTPS 流量。
  • 向使用 HTTPS 的侦听器发起 HTTP 流量,且未配置重定向。
  • 已配置相互身份验证,但无法正确协商。
  • 请求不符合 RFC。

请求不符合 RFC 要求的一些常见原因包括:

类别 示例
请求行中的主机名无效 包含两个冒号的主机名 (example.com:8090:8080)
缺少主机头 请求不包含主机头
字符格式错误或非法 保留字符为 &,!.解决方法是将其编码为百分比。 例如:%&
HTTP 版本无效 Get /content.css HTTP/0.3
标头字段名称和 URI 包含非 ASCII 字符 GET /«úü¡»¿.doc HTTP/1.1
POST 请求缺少 Content-Length 标头 自释性
HTTP 方法无效 GET123 /index.html HTTP/1.1
标头重复 Authorization:<base64 编码内容>,Authorization: <base64 编码内容>
Content-Length 中的值无效 Content-Length: abc,Content-Length: -10

在配置了相互身份验证的情况下,多个场景可能导致客户端返回 HTTP 400 响应,例如:

  • 未提供客户端证书,但启用了相互身份验证。
  • 已启用 DN 验证,但客户端证书的 DN 与指定证书链的 DN 不匹配。
  • 客户端证书链与定义的 SSL 策略中配置的证书链不匹配。
  • 客户端证书已过期。
  • 已启用 OCSP 客户端吊销检查,证书已吊销。
  • 已启用 OCSP 客户端吊销检查,但无法联系。
  • 已启用 OCSP 客户端吊销检查,但证书中未提供 OCSP 响应方。

若要详细了解如何排查相互身份验证故障,请参阅错误代码故障排除

401 - 未经授权

如果客户端无权访问资源,则会向客户端返回 HTTP 401 未经授权的响应。 返回 401 的原因有几种。 下面是可能修复的几个原因。

  • 如果客户端具有访问权限,则可能具有过时的浏览器缓存。 清除浏览器缓存,然后再次尝试访问应用程序。

如果后端池被配置为“NTLM”身份验证,可能会返回“HTTP 401 未经授权”对 AppGW 的响应。 此在方案,后端标记为正常。 可以通过几种方法解决此问题:

  • 允许在后端池中进行匿名访问。
  • 将探测配置为将请求发送到另一个不需要 NTLM 的“假”站点。
  • 不建议使用,因为此操作不会告诉我们应用程序网关后面的实际站点是否处于活动状态。
  • 配置应用程序网关以允许 401 响应对探测有效:探测匹配条件

403 - 禁止

若客户使用 WAF SKU 并在防护模式下配置了 WAF,则会显示“HTTP 403 禁止访问”。 如果已启用 WAF 规则集或自定义拒绝 WAF 规则与入站请求特征匹配,则客户端将显示“403 禁止访问”响应。

客户端收到 403 响应的其他原因包括:

  • 你正在使用应用服务作为后端,并且配置为允许仅从应用程序网关访问。 应用服务可能会返回 403 错误。 这通常是由于重定向/href 链接直接指向应用服务,而不是指向应用程序网关的 IP 地址。
  • 如果你正在查看存储博客文章,且应用程序网关和存储终结点位于不同的区域,则当应用程序网关的公共 IP 地址不在允许列表中时,会返回 403 错误。 请参阅允许从某个范围内的 Internet IP 进行访问

404 - 找不到页面

如果请求发送到以下应用程序网关,则会返回 HTTP 404 响应:

408 - 请求超时

若发往应用程序网关前端侦听器的客户端请求在 60 秒内未得到响应,则会显示 HTTP 408 响应。 当虚拟设备检查流量时,或者客户端本身不堪重负时,可能会由于本地网络和 Azure 之间流量拥塞而出现此错误。

413 - 请求实体太大

应用程序网关上使用 Azure Web 应用程序防火墙时,若客户端请求大小超过最大请求正文大小限制,可以观察到 HTTP 413 响应。 请求正文大小上限字段控制不包括任何文件上传的总请求大小限制。 请求正文大小的默认值为 128 KB。 有关详细信息,请参阅 Web 应用程序防火墙请求大小限制

499 - 客户端关闭了连接

如果使用 v2 SKU 发送到应用程序网关的客户端请求在服务器完成响应之前关闭,则会显示 HTTP 499 响应。 此错误可能出现在 2 种情况下。 第一种情况是将一个大型响应返回给客户端,而客户端在服务器完成发送该大型响应之前已关闭或刷新其应用程序。 第二种情况是客户端上的超时很短,它不会等待足够长的时间来接收服务器的响应。 在这种情况下,最好增大客户端上的超时。 在使用 v1 SKU 的应用程序网关中,对于在服务器也完成响应之前就关闭连接的客户端,可能会引发 HTTP0 响应代码。

5XX 响应代码(服务器错误)

500-599 响应代码表示在执行请求时应用程序网关或后端服务器存在问题。

500 - 内部服务器错误

Azure 应用程序网关不应显示 500 响应代码。 如果看到此代码,请创建支持请求,因为此问题属于服务内部错误。 有关如何打开支持案例的信息,请参阅创建 Azure 支持请求

502 - 错误的网关

HTTP 502 错误可能有多个根本原因,例如:

  • NSG、UDR 或自定义 DNS 阻止了对后端池成员的访问。
  • 虚拟机规模集的后端 VM 或实例未响应默认的运行状况探测。
  • 自定义运行状况探测的配置无效或不正确。
  • Azure 应用程序网关的后端池未配置或为空
  • 虚拟机规模集中没有正常运行的 VM 或实例。
  • 用户请求出现请求超时或连接问题 - 如果后端响应时间超过后端设置中配置的超时值,则 Azure 应用程序网关 V1 SKU 会发送 HTTP 502 错误。

若要了解哪些情况下会发生 502 错误以及如何进行故障排查,请参阅排查“错误的网关”错误

504 - 网关超时

如果后端响应时间超过后端设置中配置的超时值,则 Azure 应用程序网关 V2 SKU 会发送 HTTP 504 错误。

IIS

如果后端服务器是 IIS,请参阅 Web 网站的默认限制,了解如何设置超时值。 有关详细信息,请参阅属性“connectionTimeout”。 确保 IIS 中的连接超时与后端设置中的超时匹配或不超过设置的超时值。

nginx

如果后端服务器是 nginx 或 nginx 入口控制器,并且它具有上游服务器,请确定 nginx:proxy_read_timeout 的值匹配或不超过后端设置中设置的超时。

后续步骤

如果本文中的信息无法解决问题,请提交支持工单