错误页不只是「好看一点」。404 要让用户有下一步可走,503 要给出恢复时间,429 一定要带 Retry-After。另外别给错误页设长缓存——否则问题修好了,用户浏览器里还存着旧页面,怎么刷新都是错。
-
状态码
-
建议缓存
-
Retry-After
-
SEO 处理
| 状态码 | 含义 | 能否长缓存 | SEO 处理 |
|---|
错误页文件建议命名为 code.html(如 404.html)并放在站点根目录;服务器通过 error_page(Nginx)或 ErrorDocument(Apache)指向它。缓存策略:4xx 中的 404/410 可短缓存或不缓存,5xx 一律 no-store;503 必须携带 Retry-After 提示恢复时间。SEO 上,404/410 应返回真实状态码而不是 200,否则搜索引擎会把错误页当成有效内容收录。
错误页在承担三件事
很多站点把错误页做成了「一个悲伤的表情 + 一句话」,其实它应该完成三个任务:
- 告诉用户发生了什么,用人类语言,而不是甩一个状态码。
- 给出下一步动作——返回首页、搜索、看热门内容。404 页最大的价值就是把迷路的人接住。
- 对机器表意:返回正确的 HTTP 状态码,告知能否缓存、何时重试。
各状态码的处理要点
| 状态码 | 含义 | 缓存 | 额外要求 |
|---|---|---|---|
| 400 | 请求格式错误 | 不缓存 | 提示用户检查参数 |
| 401 | 未认证 | 不缓存 | 必须带 WWW-Authenticate 响应头 |
| 403 | 已认证但无权限 | 不缓存 | 不要伪装成 404 来隐藏资源 |
| 404 | 资源不存在 | 可短缓存 | 返回真实 404,别返回 200 |
| 405 | 方法不允许 | 不缓存 | 响应头 Allow 列出可用方法 |
| 410 | 资源已永久删除 | 可长缓存 | 比 404 更明确,可加速搜索索引清理 |
| 429 | 请求过于频繁 | 不缓存 | 务必带 Retry-After |
| 500 | 服务器内部错误 | 不缓存 | 绝不暴露堆栈或数据库信息 |
| 502 | 网关错误 | 不缓存 | 多为后端进程挂掉 |
| 503 | 服务不可用 | 不缓存 | 必须带 Retry-After,适合维护页 |
| 504 | 网关超时 | 不缓存 | 排查后端耗时与超时配置 |
三个最容易犯的错误
- 错误页返回 200,这是最严重的一种。搜索引擎会把每个不存在的 URL 都当成有效页面收录,产生大量重复内容,站点质量评分被拉低。正确做法是让服务器在处理错误页时保持原始状态码。
- 给 5xx 页面设长缓存。曾经有站点把 503 维护页设成 max-age=86400,结果服务恢复后用户整整一天看到维护页。
- 500 页面暴露技术细节。把数据库连接字符串、框架版本、文件绝对路径打给用户,等于免费给攻击者做信息收集。生产环境要统一收口成一句「服务暂时不可用」。
顺手可以做的一件小事:404 埋点
404 页是最容易被忽略的数据金矿。把「谁在什么时候访问了哪个不存在的 URL、来源是什么」记下来,通常能发现三类问题:站内链接写错了、老页面改版后没做 301 跳转、外部站点在引用一个已经消失的地址。定期看这份清单,能顺手修掉一批长期的流量流失。
最后一个实践建议:把维护页做成独立的 503 页面并预置好。等出故障时再临时做页面,往往手忙脚乱;提前把「系统升级中,预计 X 点恢复」的页面准备好,配合 Retry-After,既能减少客服压力,也符合搜索引擎对临时不可用的处理规范。
你可能还想问
自定义错误页有什么用?
在出错时给用户明确提示与返回路径,减少流失;同时也避免默认页面泄露服务器信息。
要注意返回状态码吗?
要注意。错误页必须返回正确的状态码,否则搜索引擎会把不存在的页面当成有效页收录,影响站点质量。
内容怎么设计更好?
给出简明原因、返回首页或搜索入口、必要时提供联系方式;不要放自动跳转,那会让用户来不及看清。
速查在线工具箱