chrome 浏览器 "400 Bad Request"

chrome打开V2EX后,出现400 Bad Request,如下图:请输入图片描述

搜了一下,说错误原因可能是请求头不符合协议标准,一般都是由于cookie过长导致。

An http 400 bad request error means the server thinks your web browser is not obeying all the HTTP protocol rules.

于是我删除了v2ex的cookie,然后刷新页面,结果还是不可以。看了下浏览器请求头信息,如下: 请输入图片描述

没有了cookie结果仍然是400错误。我试着用Safari浏览器打开网站,则正常显示。

用python模拟了浏览器的访问,也可以正常抓取页面,如下:

>>> headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Charset':'UTF-8,*;q=0.5','Accept-Encoding':'gzip,deflate,sdch','Accept-Language':'zh-CN,zh;q=0.8','Cache-Control':'max-age=0','Host':'www.v2ex.com','Proxy-Connection':'keep-alive','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31'}
>>> r = requests.get("http://www.v2ex.com/", headers = headers)  
>>> r.status_code
200

这是什么原因呢?

阅读 57.7k
2 个回答

你应该点一下Request Header旁边的view source看一下实际发送的请求是什么样子的。我看到你的请求头里面有一个Proxy-Connection,这是个非标准的HTTP头,通常是浏览器检测到存在代理服务器的时候添加的。所以,我怀疑你的浏览器实际发的请求是这样的:

GET http://v2ex.com/ HTTP/1.1

也就是说,在GET请求中使用了绝对路径,这是给HTTP代理服务器的请求。正常情况下,代理服务器会把这个URL转换成相对路径再转发给目标服务器。而不知道什么原因,也许是代理服务器没有起作用,这个请求被直接发到了v2ex,所以返回了400 Bad request,即请求不正确。

以下试验证明了这一点:

localhost ~ $ telnet v2ex.com 80
Trying 65.255.43.91...
Connected to v2ex.com.
Escape character is '^]'.
GET http://v2ex.com/ HTTP/1.1

HTTP/1.1 400 Bad Request
Server: nginx/1.2.1
Date: Sun, 21 Apr 2013 05:15:53 GMT
Content-Type: text/html
Content-Length: 172
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.2.1</center>
</body>
</html>
Connection closed by foreign host.

400 不一定是因为cookies。它指的是请求错误,在nodejs和其它一些可编程服务端中是由程序员自定义触发的。所以不排除这是个bug,和chrome无关。也可能是你chrome中装了什么扩展导致的。我的手机chrome访问没问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题