一个实验,可以更好地了解HTTP状态代码的作用

时间:2012-09-13 15:22:18

标签: python http browser http-status-codes

服务器设置和浏览器检查

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

class customHTTPServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write('<HTML><body>Get!</body></HTML>')
        return

server = HTTPServer(('',8080),customHTTPServer)
print 'server started at port 8080'
server.serve_forever()

现在,当我使用浏览器访问http://localhost:8080时,我可以看到预期的Get!

意外的观察

测试1

现在我在服务器中使用不同的状态代码进行了测试。我尝试了以下状态代码:301302400402403404405,{{ 1}},406407408418500501502,{{1} }和504

(Q1)奇怪的是,当使用不同的状态代码(505除外)时,我得到的状态与使用状态代码511的行为相同。为什么?

测试2

其次我替换了407 使用200获取我在第一次测试中测试的所有不同状态代码。当我使用状态代码self.wfile.write('<HTML><body>Get!</body></HTML>')self.wfile.write('')403404500501502时,我现在得到了浏览器上的特定浏览器消息(504505,...)。

(Q2)为什么我只使用这些状态代码接收特定浏览器消息,但不使用其他状态代码?

摘要

我可以区分3种行为:

  • 使用状态代码403 Forbidden404 not found301302400402405,{{ 1}}或406有 与使用状态代码408无关,无论我是发送空字符串还是非空字符串。
  • 使用状态代码418511200403404500501将创建浏览器上的特定浏览器消息,但仅当空字符串为时 发送。
  • 使用状态代码502会返回特定的浏览器消息(显示504错误),无论我是发送空字符串还是非空字符串。

2 个答案:

答案 0 :(得分:2)

(A1)当您发送错误代码但仍然返回正文时,浏览器会认为它是您的网络服务器发送的自定义错误页面。这就是例如stackoverflow为未知文档的请求提供custom page的方式,而不是404的默认浏览器页面。

(A2)检查没有显示浏览器消息的状态代码的含义,并询问自己返回时是否显示浏览器消息是否合理。此外,最有可能的是,在显示或不显示消息时,浏览器与浏览器之间会有所不同。

答案 1 :(得分:1)

以404 Not Found为例。网站通常会生成一个自定义404页面,其中包含一些网站导航方式。这比浏览器生成的错误消息更有用。因此,如果服务器返回404内容,则浏览器会显示它。

它还允许有关特定错误的更多信息。例如。 403 Forbidden可能会提供有关限制访问资源的原因或如何申请访问权限的信息。

如果你阅读spec,这并不奇怪。它定义哪些状态代码可以包含实体,哪些不能包含(如204 No Content :)。

请注意,如果您使用其他UA(例如wget),您可能会注意到它以不同方式处理404响应。