403、404、500、502、503 和 504 在本平台上究竟意味着什么,以及针对每一种情况应采取的具体措施。
错误代码并非一个笼统的失败提示。它告诉您堆栈中的哪一层出了问题,这能极大地缩小排查范围。502 和 504 在访问者看来一模一样,但成因和解决方法完全不同。
读取真实的错误代码
在开始排查之前,先获取真实的数字。一个美观的错误页面可能显示一种信息,而服务器返回的却是另一种。
在浏览器中打开开发者工具,进入 Network 标签页,刷新页面,点击第一个请求。状态码显示在 Headers 面板的顶部。
在终端中:
curl -sSI https://yourdomain.com/
这会打印状态行和响应头,而不会下载页面。响应头很重要:下文列举的几种情况需要通过响应头而非仅凭代码本身来识别。

简要说明
| 代码 | 含义 | 谁的问题 |
|---|---|---|
| 401 | 需要身份验证 | 已开启密码保护 |
| 403 | 被主动拒绝 | 某条安全规则拦截了请求 |
| 404 | 未找到 | 您网站的问题,通常是路由问题 |
| 500 | 您的应用程序崩溃 | 您的代码或插件 |
| 502 | Web 服务器背后的服务出现故障 | 通常是您的应用程序问题 |
| 503 | 当前被主动暂停服务 | 已暂停、已挂起或正在维护 |
| 504 | 耗时过长 | 您代码中的某部分运行缓慢 |
401 未授权
您会看到浏览器弹出的用户名和密码输入框,而不是一个页面。这表示该网站或该路径已启用了基本的密码保护。
可在网站(Websites)、相应站点、设置(Settings),然后是密码保护中关闭它,或获取凭据。请参阅密码保护。
证书续期在启用密码保护期间仍能正常工作,因此这不会影响您的 HTTPS。
403 禁止访问
403 表示某个环节主动拒绝了该请求。在本平台上,有四种不同的来源。
Web 应用防火墙。 每个网站背后都有一个规则引擎,用于检查传入请求并拦截与已知攻击模式匹配的请求。这是意外出现 403 的最常见原因,而且几乎总是对合法但不寻常的请求的误判:例如较长的表单提交、页面构建器保存复杂内容,或插件提交原始代码。
防火墙拦截的症状:某个特定操作每次都返回 403,而网站的其余部分一切正常,并且在不同的浏览器和不同的网络上也会出现同样的失败。
解决方法是添加一条有针对性的规则排除项,这需要支持团队来完成。请不要去寻找关闭防火墙的开关;共享主机上没有这样的开关,而且即便有,那也不是正确的解决方法。请提交工单,说明确切的 URL、确切的时间以及您当时在进行的操作。请参阅提交支持工单。
地理位置封锁。 如果您已将网站限制为仅对特定国家/地区开放,其余所有人都会收到 403。请检查设置(Settings),然后是安全(Security)。请参阅地理位置封锁。
IP 封锁。 可能是您自己在"安全"设置中添加的,也可能是平台层面的滥用封锁。
文件权限或符号链接问题。 这种情况较少见,通常出现在通过 SSH 进行手动文件操作之后。
404 未找到
服务器已响应,但该地址下没有任何内容。
仅单个页面返回 404。 该文件或文章确实不存在,或者 URL 本身有误。
除首页外的所有页面都返回 404。 这是一个路由问题,在 WordPress 上几乎总是固定链接(permalinks)的问题。需要注意的是:KapsuleHost 的网页托管运行的是 nginx,而非 Apache,因此 .htaccess 重写规则在这里不起作用。如果您是从使用这些规则的主机迁移过来的,这就是原因所在。请参阅固定链接问题和WordPress 与 .htaccess。
整个网站都返回 404。 请检查网站是否指向了正确的文档根目录,以及您的域名是否关联到了正确的网站。请参阅为网站设置自定义域名。
本地可以正常运行,但在线上返回 404。 Linux 文件名区分大小写。Logo.PNG 和 logo.png 是两个不同的文件。
500 内部服务器错误
您的应用程序运行后崩溃了。Web 服务器本身没有问题;是代码出了问题。
在这种情况下,日志几乎能立即给出答案,因为 PHP 致命错误会记录出错的文件和行号,这通常能直接指出具体是哪个插件出了问题。
- 转到网站(Websites)、相应站点、设置(Settings),然后是日志(Logs)。
- 查看最近的记录条目。
- 将时间戳与您看到错误的时间进行比对。
请参阅错误日志。关于 WordPress 特有的版本,即页面显示为空白而非显示错误的情况,请参阅WordPress 白屏问题。
最常见的原因是插件或主题与您的 PHP 版本不兼容、达到内存限制,以及数据库连接失败。请参阅PHP 扩展与设置和WordPress 内存限制。
502 错误网关
Web 服务器尝试将请求转交给您的应用程序,但没有得到可用的响应。应用程序进程拒绝了连接,或者在处理请求的过程中终止了。
常见原因:
- PHP 进程崩溃,通常是因为单次请求耗尽了内存。
- Node.js 应用程序未在运行,或在启动时崩溃。
- 突发流量耗尽了可用的工作进程。
应采取的措施:如上所述,先检查日志。如果是 Node 应用程序,请检查该进程是否确实在运行,并查看其启动输出。如果 502 仅在流量最高峰时出现,那就是容量问题,而非漏洞问题。请参阅网站运行缓慢与资源限制。
如果是在保存设置时由 KPanel 本身返回的 502,则含义有所不同。这表示面板无法将配置更改应用到 Web 服务器,因此它回滚了该更改,而不是让您的网站处于配置不完整的状态。您的网站不受影响。请重试,如果仍然持续失败,请提交工单。
503 服务不可用
503 表示服务器当前正主动拒绝提供服务。在本平台上,有三种具体原因,响应内容会告诉您是哪一种。
您的网站已被暂停。 您会看到一个标题为"This site is paused"的页面。这是账单或账户状态问题,而非技术故障,一旦该状态解除,网站会立即恢复。请检查账单(Billing)。请参阅付款失败和账户已暂停。
平台维护。 全平台维护页面,这种情况很少见,而且会提前公告。请查看状态与正常运行时间。
504 网关超时
您的应用程序仍在运行,只是 Web 服务器等得不耐烦了。没有任何东西崩溃,只是速度太慢。
典型原因:
- 通过浏览器运行的长时间导入、导出、备份或批量操作。
- 插件在每次页面加载时都调用一个缓慢的外部 API。
- 一个开销很大且没有索引支持的数据库查询。
- 一个本应由真正的 cron 触发、却由页面访问触发的 cron 任务。
应采取的措施:
- 找出哪个请求速度缓慢。WordPress 网站上的 APM 标签页可以帮您查看。请参阅网站性能。
- 对于耗时较长的操作,使用命令行而非浏览器。请参阅WP-CLI。
- 将计划任务迁移到真正的 cron。请参阅Cron 任务。
- 如果该任务确实需要更长的时间,可提高
max_execution_time,不过这只是一种折中方案,而非根本解决办法。请参阅PHP 扩展与设置。
请注意两者的区别:如果 PHP 先触发了自身的执行时间限制,您会得到 500 而非 504。两者都表示"太慢了",只是发生在不同的层面。
完全没有响应
有时根本没有错误代码,因为根本没有响应。连接只是挂起,最终超时。
如果这种情况只在某个网络下出现,而在其他网络下网站可以正常访问,尤其是在手机使用移动数据网络的情况下,最可能的原因是自动化的滥用封锁:来自您所在地址的一连串错误或登录失败触发了临时的网络层面封禁。这些封禁通常会在一小时内自行解除。如果您需要尽快解除,请联系支持团队,并提供您当前连接所使用的 IP 地址。
自定义错误页面
您可以在网站(Websites)、相应站点、设置(Settings),然后是错误页面中,用自己的 HTML 替换 400、401、403、404、500、502、503 和 504 的默认错误页面。如果您未自行设置,KapsuleHost 会为 404、500、502、503 和 504 提供带品牌标识的默认页面。
有一点值得了解:自定义错误页面仍会保留真实的状态码。自定义的 404 页面依然会返回 404 状态码。用 200 状态码提供错误页面是摧毁搜索引擎排名的经典做法,而本平台刻意不允许这样做。请参阅自定义错误页面。