500 Internal Server Error
用法
500 Internal Server Error 状态码表示服务器端发生了一般性故障。由于此错误性质宽泛,具体原因取决于所处环境。Web 服务器正在遇到问题,需要服务器管理员采取行动来解决。
该错误通常归因于一个或多个文件的权限问题、脚本超时,或 .htaccess 文件损坏。唯一可以确定的是,HTTP 请求未被满足。
注意
作为终端用户,500 错误不是客户端的过错。唯一的做法是稍后等待并重试,或联系站点管理员。大多数 500 错误是暂时性的,由资源耗尽或部署问题等瞬时状况引起。
注意
若 500 响应泄露堆栈跟踪、数据库查询、文件路径或框架版本,就会暴露对攻击者有用的信息。生产服务器必须返回通用的错误页面,并仅在服务器端记录详细信息。
SEO 影响
Googlebot 将 5xx 错误视为暂时降低整个站点抓取速率的信号。已被索引的 URL 起初会被保留,但长时间的停机会导致 Google 将它们从索引中剔除。任何随 500 响应返回的内容都会被忽略。在这方面,Google 对 500、502 和 503 一视同仁。robots.txt 文件上的 5xx 错误要严重得多,即便站点上其他每个页面都返回 200。Google 会暂停抓取长达 12 小时,然后回退到缓存副本长达 30 天。如果错误持续,Google 会将该站点完全从索引中移除。Bingbot 同样将 5xx 响应视为抓取失败。持续的 5xx 错误会阻止在 Bing 中被索引。
示例
客户端请求某个资源,服务器返回 500 Internal Server Error 状态码,表明请求将不会被满足。
请求
GET /news.html HTTP/1.1
Host: example.com
响应
HTTP/1.1 500 Internal Server Error
Content-Type: text/html; charset=UTF-8
Content-Length: 139
<html>
<head>
<title>Request Failed</title>
</head>
<body>
<p>The request failed due to a server error.</p>
</body>
</html>
如何修复
从错误日志入手。在 nginx 中,检查 /var/log/nginx/error.log。在 Apache 中,检查 /var/log/apache2/error.log 或 /var/log/httpd/error_log。日志条目几乎总会指明出错的文件和行号。
常见根本原因及其修复方法:
在确定原因后,部署修复并监控错误日志以防复发。设置日志告警,以便在用户报告之前就捕捉到 500 的激增。
代码参考
.NET
HttpStatusCode.InternalServerError
Rust
http::StatusCode::INTERNAL_SERVER_ERROR
Rails
:internal_server_error
Go
http.StatusInternalServerError
Symfony
Response::HTTP_INTERNAL_SERVER_ERROR
Python3.5+
http.HTTPStatus.INTERNAL_SERVER_ERROR
Java
java.net.HttpURLConnection.HTTP_INTERNAL_ERROR
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_SERVER_ERROR
org.apache.hc.core5.http.HttpStatus.SC_INTERNAL_SERVER_ERROR
Angular
@angular/common/http/HttpStatusCode.InternalServerError