0

服务器设置和浏览器检查

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

现在我在我的服务器中使用不同的状态码进行了测试。我试过这些状态码:301, 302, 400, 402, 403, 404, 405, 406, 407, 408, 418, 500, 501, 502, 504,505511.

(Q1)奇怪的是,当使用不同的状态码(除了407)我得到与使用状态码相同的行为200。这是为什么?

测试 2

其次,我替换self.wfile.write('<HTML><body>Get!</body></HTML>')self.wfile.write('')我在第一次测试中测试的所有不同状态代码。当我使用状态码403, 404, 500, 501, 502,504或者505我现在在浏览器上收到特定的浏览器消息 ( 403 Forbidden, 404 not found, ...)。

(Q2) 为什么我只收到使用这些状态码的特定浏览器消息,而没有使用其他状态码?

概括

我可以区分 3 种类型的行为:

  • 使用状态码301, 302, 400, 402, 405, 406,或与使用状态码没有区别,408无论我发送的是空字符串还是非空字符串。418511200
  • 使用状态码403, 404, 500, 501, 502,504505将在浏览器上创建特定的浏览器消息,但仅在发送空字符串时。
  • 无论我发送的是空字符串还是非空字符串,使用状态码407都会返回特定的浏览器消息(显示错误)。323
4

2 回答 2

2

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

(A2) 检查没有显示浏览器消息的状态码的含义,并问自己在返回它们时显示浏览器消息是否明智。此外,最有可能的是,在显示或不显示消息时,它会因浏览器而异。

于 2012-09-13T15:31:42.750 回答
1

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

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

如果您阅读规范,这并不奇怪;它定义了哪些状态代码可以包含正文,哪些不能(例如 204 No Content :)。

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

于 2012-09-13T15:39:03.447 回答