HTTPQUERY
English

404 Not Found

用法

收到 404 Not Found 错误时,该状态并未说明资源是永久不可用、临时不可用,还是从未存在过。这类错误最常源于拼错的 URL,处理仍在开发中的一组资源的开发者经常会遇到它。

指向返回 404 Not Found 地址的链接通常被称为死链或坏链。当服务器不愿承认某个资源存在时,也会使用该状态。

当服务器知道资源曾经存在于指定地址但已被永久移除时,410 Gone 状态更具信息量。

由于终端用户经常遇到此错误,许多服务器会为其站点使用一个描述性强且相关的自定义错误页。

注意

404 并不意味着客户端被封禁。被封禁会产生 403 Forbidden。有些服务器返回 404 而非 403,以隐藏资源的存在。404 并不表示永久性。资源之后可能会出现。对于永久移除,服务器返回 410 Gone。

SEO 影响

像 Google 这样的搜索引擎不会索引返回 404 状态的 URL。此前已被索引、如今返回该状态码的 URL 会从搜索结果中移除。返回此状态码的页面不会消耗抓取预算。Google 对 404 和 410 的处理完全相同。二者都会以相同的速率将内容从索引中移除。Bingbot 将 404 视为内容移除信号,并在后续重新抓取确认该状态后取消对该 URL 的索引。返回带错误内容的 200 而非正确的 404 会造成软 404,这会浪费抓取预算并削弱对站点服务器信号的信任。

示例

客户端请求某个资源,由于该资源不存在于指定地址,服务器返回 404 Not Found。

请求

GET /documents/secret-formula.pdf HTTP/1.1
Host: example.com

响应

HTTP/1.1 404 Not Found
Content-Type: text/html
Content-Length: 216

<html>
  <head>
    <title>Resource Not Found</title>
  </head>
  <body>
    <p>The requested resource was not found.
    Check the spelling of the address.</p>
  </body>
</html>

如何修复

404 Not Found 意味着所请求的地址上不存在任何资源。

核实 URL 的拼写和路径。路径、文件名或查询字符串中的拼写错误是最常见的原因。仔细核对地址的每一段。直接从源链接复制路径,而不是手动输入。

检查大小写敏感性。基于 Linux 的服务器将 /Page 和 /page 视为不同的路径。与原始 URL 的大小写完全一致。基于 Windows 的 IIS 服务器默认不区分大小写,因此 IIS 上的 404 指向的是真正缺失的资源。

留意缺失的末尾斜杠。有些服务器会区分 /path 和 /path/。添加或移除末尾斜杠后重试。nginx 和 Apache 根据 try_files 和 DirectorySlash 配置对末尾斜杠的处理方式不同。

确认资源存在于服务器上。核实文件或路由是否已部署且可访问。SSH 登录服务器,确认文件存在于预期的文档根路径下。在 nginx 中,检查匹配的 location 块中的 root 或 alias 指令。在 Apache 中,检查虚拟主机中的 DocumentRoot。

为已移动的内容设置 301 或 308 重定向。当资源移动到新地址时,重定向旧 URL 以防止坏链。在 nginx 中:

location = /old-path {
    return 301 /new-path;
}

在 Apache .htaccess 中:

Redirect 301 /old-path /new-path

检查服务器重写规则。审查 Apache 中的 mod_rewrite 规则,或 nginx 中的 try_files 和 location 块。配置错误的重写会悄无声息地丢弃对有效路径的请求。启用重写日志以追踪规则求值。在 Apache 中,临时设置 LogLevel alert rewrite:trace3。

在 IIS 上核实 MIME 类型和处理程序映射。当文件扩展名缺少已注册的 MIME 类型或处理程序映射时,IIS 返回 404.3。在 IIS 管理器中或通过 web.config 添加缺失的 MIME 类型:

<staticContent>
  <mimeMap fileExtension=".json"
    mimeType="application/json" />
</staticContent>

检查 DNS 和虚拟主机配置。域名指向错误的服务器,或缺少虚拟主机条目,会导致所有路径都返回 404。核实 DNS 的 A/CNAME 记录解析到正确的服务器 IP,且服务器有匹配的 server_name(nginx)或 ServerName(Apache)指令。

用爬虫审计坏链。运行站点爬虫以检测站内所有的 404 响应。修复损坏的内部链接,并向搜索引擎提交更新后的 XML sitemap,以加快对已移动内容的重新索引。查找坏链的工具包括 Google Search Console(覆盖率报告)、Screaming Frog、Ahrefs Site Audit,或用于命令行检查的 wget —spider。

代码参考

.NET

HttpStatusCode.NotFound

Rust

http::StatusCode::NOT_FOUND

Rails

:not_found

Go

http.StatusNotFound

Symfony

Response::HTTP_NOT_FOUND

Python3.5+

http.HTTPStatus.NOT_FOUND

Java

java.net.HttpURLConnection.HTTP_NOT_FOUND

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_NOT_FOUND

Angular

@angular/common/http/HttpStatusCode.NotFound