你好 StackOverflow 社区!
我最近开始学习 Node.js,并决定实现一个反向 HTTP 代理作为任务。有几个艰难的地方,我自己设法通过了,但现在我有点卡住了,需要你的帮助。我设法处理了重定向和相对 url,并且通过实现相对 url 支持,我遇到了我将要描述的问题。
您可以在http://pastebin.com/vZfEfk8r找到我的代码。它不是很大,但仍然不适合此页面。
所以对于问题(其中有2个)。我正在使用 http.request 将客户端的请求转发到目标服务器,然后等待响应并将此响应发送回客户端。它适用于某些请求,但不适用于其他请求。这是第一个问题:在我用来测试代理的网站上(http://ixbt.com,关于技术的酷俄罗斯网站)我总是可以得到主页/index.html,但是当浏览器开始获取从该页面引用的其他文件(css、img 等)时,大多数请求都以 ParseError ({"bytesParsed":0}) 结尾。
在调试(使用 Wireshark)时,我注意到在代理和目标服务器之间发生以下 HTTP 协商时,某些请求(如果不是全部)失败并出现此错误:
要求:
GET articles/pics2/201206/coolermaster-computex2012_70x70.jpg HTTP/1.1
Host: www.ixbt.com
Connection: keep-alive
回复:
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
看起来服务器不发送状态代码,也没有标题。所以问题是,这可能是失败的原因(ParseError)吗?
我的另一个担忧是,当我尝试获取与独立请求相同的文件时,我没有问题。只是看看:
要求:
GET /articles/pics2/201206/coolermaster-computex2012_70x70.jpg HTTP/1.1
Host: www.ixbt.com
Connection: keep-alive
回复:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 25 Jun 2012 17:09:51 GMT
Content-Type: image/jpeg
Content-Length: 3046
Last-Modified: Fri, 22 Jun 2012 00:06:27 GMT
Connection: keep-alive
Expires: Wed, 25 Jul 2012 17:09:51 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes
... and here goes the body ...
因此,归根结底,我如何处理代理请求可能会出现一些错误。也许是因为我实际上做了很多,当主页加载时 - 它有很多图像,等等?
我希望我足够清楚,但是如果我遗漏了什么,请询问详细信息。并且完整的源代码是可用的(同样,在http://pastebin.com/vZfEfk8r),所以如果有人愿意尝试它,那就太好了。:)
非常感谢提前!
PS 正如我所说,我只是在学习,所以如果你会在我的代码中看到一些不好的做法(甚至与问题无关),了解它们会很好。
更新:正如评论中提到的,我没有代理原始请求的标头,理论上这可能会导致以下请求出现问题。我改变了这一点,但不幸的是,行为保持不变。这是新请求和响应的示例:
要求
GET css/main_fixed.css HTTP/1.1
Host: www.ixbt.com
connection: keep-alive
cache-control: no-cache
pragma: no-cache
user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5
accept: text/css,*/*;q=0.1
accept-encoding: gzip,deflate,sdch
accept-language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
accept-charset: windows-1251,utf-8;q=0.7,*;q=0.3
referer: http://www.ixbt.com/
回复
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
我不得不手工制作“referer”标头,因为浏览器使用反向代理 url 发送它。如您所见,行为仍然相同。还有其他想法吗?