打印

CH3005: 各浏览器遇到 HTTP 400 错误页面的提示方式存在巨大差异

作者:丁宗秋

标准参考

HTTP 协议的状态响应码由三位十进制数字组成。出现在由 HTTP 服务器发送的响应的第一行。响应码分五种类型,由它们的第一位数字表示。

响应码的五种类型如下表所示:

状态响应码 描述
1XX 信息
2XX 成功
3XX 重定向
4XX 客户端错误
5XX 服务器错误

详细的状态响应码信息请看下表:

状态响应码 描述 状态响应码 描述
100 继续 101 分组交换协议
200 OK 201 被创建
202 被采纳 203 非授权信息
204 无内容 205 重置内容
206 部分内容 300 多选项
301 永久地传递 302 找到
303 参见其他 304 未改动
305 使用代理 307 暂时重定向
400 请求无效 401.1 未授权:登录失败
401.2 未授权:服务器配置问题导致登录失败 401.3 ACL 禁止访问资源
401.4 未授权:授权被筛选器拒绝 401.5 未授权:ISAPI 或 CGI 授权失败
402 要求付费 403 禁止访问
403.1 禁止访问:禁止可执行访问 403.2 禁止访问:禁止读访问
403.3 禁止访问:禁止写访问 403.4 禁止访问:要求 SSL
403.5 禁止访问:要求 SSL 128 403.6 禁止访问:IP 地址被拒绝
403.7 禁止访问:要求客户证书 403.8 禁止访问:禁止站点访问
403.9 禁止访问:连接的用户过多 403.10 禁止访问:配置无效
403.11 禁止访问:密码更改 403.12 禁止访问:映射器拒绝访问
403.13 禁止访问:客户证书已被吊销 403.15 禁止访问:客户访问许可过多
403.16 禁止访问:客户证书不可信或者无效 403.17 禁止访问:客户证书已经到期或 者尚未生效
404 无法找到文件 404.1 无法找到 Web 站点
405 资源被禁止 406 无法接受
407 要求代理身份验证 408 请求超时
409 冲突 410 永远不可用
411 要求的长度 412 先决条件失败
413 请求实例太大 414 请求 - URL 太长
415 不支持的媒体类型 416 无法满足的请求范围
417 失败的预期 500 内部服务器错误
500.11 服务器关闭 500.12 应用程序重新启动
500.13 服务器太忙 500.14 应用程序无效
500.15 不允许请求 global.asa 500.24 当前网站的应用的IIS程序池不正确
500.100 内部服务器错误 - ASP 错误 501 未实现
502 网关错误 503 不可用的服务
504 网关超时 505 HTTP 版本未被支持

关于 HTTP1.1状态响应码的更多信息,请参考HTTP协议 rfc261610 章。

问题描述

如果服务器端产生 HTTP 400 错误,并且在服务器端没有配置相应的显示页面,则会由本地客户端使用本地资源文件显示此错误信息。但是各浏览器的本地资源提示不同,更有些浏览器使用空白页代替本体错误提示页,造成用户识别混淆。

造成的影响

不同的本地提示错误页面会导致用户识别错误信息混淆,如果是未实现的本地错误提示页,也有可能会以空白页显示,这会让用户误以为页面还没有加载完成。

受影响的浏览器

所有浏览器  

问题分析

一般情况下,如常见的 HTTP 402、HTTP 403、HTTP 404 、HTTP 500 等错误,服务器端都会有默认配置用远程页面来做对应显示,如果服务器端没有配置,那么本地客户端浏览器也会使用本地资源文件内对应的错误页面来提示用户出现 HTTP 错误。

但是,如果请求产生了 HTTP 400 错误,在服务器端没有配置相应远程显示页面的情况下,本地不同浏览器使用的本地提示页面存在很非常大的差异。

我们可以通过如下方式将此问题模拟出来,步骤如下1

  1. 建立index.jsp文件,内容为:<%response.sendError(400)%>;
  2. 修正 tomcat 的 web.xml 文件,将 HTTP 400 错误输出信息定位到index.jsp文件,避免服务器返回自身预定义的 HTTP-400 信息,如下:
    <error-page>
                      <error-code>400</error-code> <location>/index.jsp</location>
                      </error-page>
    然后访问 index.jsp 将会产生 http-400 错误,它会触发 tomcat 调用页面自身,这样就发送了纯净的 http-400 错误信息。
  3. 通过 Charles 分析工具结果证明以上方法模拟无误,如下图所示:

【注】:此处以 java 技术为例来说明此问题,仅为避免与本站 PHP 技术体系干扰。如果使用 PHP 技术则无法在本站线上部署环境中配置出不干扰正常应用的测试用例,因此使用 JAVA 技术来说明此问题,有兴趣的读者可以自行在本地配置 JAVA 环境测试。

当浏览器接到此响应后,如果服务器没有返回任何有效 HTML 代码,则应由浏览器将详细错误提示给用户。

这个提示信息是一个本地的HTML文件,存在于本地浏览器程序文件内,属于本地资源文件。

IE 浏览器就是这么做的,它的 HTTP 400 错误提示文件存在于:"res://ieframe.dll/http_400.htm",只要将这个地址输入 IE 浏览器地址栏就可见到。

其它浏览器则使用了没有任何提示信息的空白本地 HTML 资源文件来显示这个服务器端响应。相比 IE 来说显得信息提示不够 "人性化"。

解决方案

HTTP 出错时返回错误代码,如果服务器端没有设置显示该问题的页面,则会由本地浏览器根据本地预置资源文件来显示,这些本地页面的显示风格由各浏览器决定,无法由用户控制。因此最好的解决方案还是在服务器端配置所有的错误代码对应的远程页面。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6.10
Chrome 7.0.544.0 dev
Safari 5.0.2
Opera 10.62
测试页面:  
本文更新时间: 2010-10-09

关键字

HTTP 503 500 404 403 400 协议的状态响应码 浏览器 本地资源文件