Skip to main content

如何解决常见的 HTTP 错误代码

作者: Mitchell Anicas

介绍

访问 Web 服务器或应用程序时,服务器会以HTTP状态码对应其接收到的每个 HTTP 请求。HTTP 状态码是三位数字代码,共有五类,分别可以通过代码的第一个数字来识别:

  • 1xx:消息
  • 2xx:成功
  • 3xx:重定向
  • 4xx:请求错误
  • 5xx:服务器错误 本指南从系统管理员的角度介绍如何识别和排除最常见的 HTTP 错误代码——即4xx 和 5xx 状态码。很多情况都会导致 Web 服务器响应请求时发出特定的错误代码——我们将介绍其常见的潜在原因和解决方案。

客户端错误和服务器错误概述

客户端错误,即从 400 到 499 的 HTTP 状态码,是对用户客户端(即 Web 浏览器或其他 HTTP 客户端)发出的HTTP 请求所响应的结果。 尽管这一类错误与客户端相关,但如果知道用户遇到的是哪一类错误代码,往往有助于确定是否可以通过服务器配置来修复潜在问题。 而当 Web 服务器发现错误或发现无法处理请求时,就会发送服务器错误,即从 500 到 599 的 HTTP 状态码。

解决技巧

  • 用 Web 浏览器测试 Web 服务器时,请在更改服务器后刷新浏览器。
  • 检查服务器日志以获取其处理请求的详细信息。 例如,Apache 或 Nginx 等 Web 服务器会生成两个名为 access.logerror.log 的文件,可以扫描它们以获取相关信息。
  • 请记住,处理请求的应用程序有自己的一套标准,HTTP 状态码的定义是其中的一部分。这也就意味着,返回的实际状态码取决于这个服务器软件是如何处理特定错误的——不过一般情况下,本指南都是正确无误的。 现在您已经对 HTTP 状态码有了进一步的了解,接下来让我们看看有哪些常见的错误类型。

400 请求无效(400 Bad Request)

400状态码,即 请求无效 错误,指的是服务器接收到的HTTP请求语法无效。 以下是可能发生400请求无效错误的几个示例:

  • 与站点关联的用户 cookie 已损坏:清除浏览器的缓存和cookie可以解决这个问题。
  • 由于浏览器故障导致了格式错误的请求。
  • 手动形成 HTTP 请求时出现人为错误,导致了格式错误的请求(例如,错误地使用curl)。

401 未授权(401 Unauthorized)

401 状态码,即 未授权 错误,指的是尝试访问资源的用户未经过身份验证或未正确验证,这意味着用户必须提供凭据才能查看受保护的资源。 一个经常发生的401未授权错误的示例是,如果用户尝试访问受 HTTP 身份验证保护的资源,将收到一个401状态码,除非用户向 Web 服务器提供有效的用户名和密码(存在于.htpasswd文件中)。

403 禁止访问(403 Forbidden)

403 状态码,即 禁止访问 错误,指的是用户发出了有效的请求,但由于缺乏访问所请求资源的权限,服务器拒绝了处理该请求。如果您意外遇到 403 错误,以下是一些典型的原因:

文件权限(File Permissions)

当运行 Web 服务器进程的用户没有足够的权限来读取正在访问的文件时,通常会发生 403 错误。 举一个发现403错误的例子,假设:

  • 用户正在尝试从 http://example.com/index.html 访问 Web 服务器的索引文件
  • Web 服务器工作进程由 www-data 用户所有
  • 在服务器上,索引文件位于 /usr/share/nginx/html/index.html 如果用户收到 403 禁止访问 错误,请确保 www-data 用户具有足够的权限来读取文件。这通常意味着文件的 其他权限(other permissions) 应设置为 可读(read)。 有几种方法可以确保这一点,但以下命令将在这种情况下起作用:
Sudo chmod o=r /usr/share/nginx/html/index.html

分布式配置文件(.htaccess)

403错误的另一个潜在原因(通常是刻意的)是使用 .htaccess 文件。 例如,.htaccess 文件可用于限定一定的IP 地址或范围对特定资源的访问。 如果意外收到 403 Forbidden 错误,请确保该错误不是由您的 .htaccess 设置引起的。

索引文件不存在(Index File Does Not Exist)

如果用户试图访问一个没有默认索引文件的目录,并且没有启用目录列表,Web 服务器将发出403禁止访问错误。 例如,如果用户尝试访问 http://example.com/emptydir/ ,而服务器的emptydir目录中没有索引文件,服务器就会发出403状态码。 您可以在Web 服务器配置中启用目录列表。

404 页面未找到(404 Not Found)

404 状态码,即 页面未找到 错误,指的是用户能够与服务器通信,但无法找到请求的文件或资源。 404 错误可能在多种情况下发生。 如果用户意外收到 404 Not Found 错误,可以在进行故障排除时考虑以下问题:

  • 将用户定向到您的服务器资源的链接中是否存在错字?
  • 用户是否输入了错误的 URL?
  • 该文件是否在服务器的正确位置上? 该资源是否曾在服务器上被移动或删除?
  • 服务器配置是否处在正确的文档根目录中?
  • 拥有 Web 服务器工作进程的用户是否有权限遍历请求文件所在的目录 (提示:目录需要读取和执行权限才能访问)?
  • 被访问的资源是符号链接吗? 如果是这样,请确保将 Web 服务器配置为遵循符号链接。

500 内部服务器错误(500 Internal Server Error)

500状态码,即 内部服务器错误 ,指的是服务器由于未知原因无法处理请求。 有时即使另一个更具体的 5xx 错误代码更适合当前情况,也会出现此代码。 导致此错误的最常见原因是服务器配置错误(例如,格式错误的.htaccess文件)或软件包缺失(例如,在未正确安装 PHP 的情况下尝试执行 PHP 文件)。

502 错误网关(502 Bad Gateway)

502 状态码,即 错误网关 错误,指的是作为网关或代理工作的服务器未从实际应该满足请求的后端服务器接收到有效响应。 如果相关服务器是反向代理服务器,例如负载均衡器,则需检查以下几点:

  • 后端服务器(HTTP 请求被直接转发到的地方)性能良好;
  • 反向代理正确配置,指向正确的后端;
  • 后端服务器和反向代理服务器之间的网络连接良好。 如果服务器可以在其他端口上通信,请确保防火墙允许它们之间的通信;
  • 如果您的 Web 应用程序配置为监听套接字,请确保套接字存在于正确的位置并且具有相应的权限。

503 服务器不可用(503 Service Unavailable)

503 状态码,即 服务不可用 错误,指的是服务器超载或正在维护中,这意味着该服务器会在某个时候恢复正常。 如果服务器未在维护中,这表明服务器可能没有足够的 CPU 或内存资源来处理所有传入请求,或是需要将 Web 服务器配置为允许更多用户、线程或进程。

504 网关超时错误(504 Gateway Timeout)

504 状态码,即 网关超时 错误,表示作为网关或代理工作的服务器未在允许的时间段收到后端服务器的响应。 这通常发生于以下情况:

  • 服务器之间的网络连接不良
  • 满足请求的后端服务器性能不佳,因此速度太慢
  • 网关或代理服务器设置的超时时间过短

结语

在熟悉了最常见的 HTTP 错误代码并了解这些代码的常见解决方案后,您已为解决Web 服务器或应用程序的故障打下了良好的基础。