3

你好 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 发送它。如您所见,行为仍然相同。还有其他想法吗?

4

2 回答 2

5

感谢宝贵的意见,我能够找到这个问题的答案。它与 Node 或目标 Web 服务器无关,只是一个编码错误。答案是 url 的路径组件对于相对 url 是错误的。从我在问题正文中的日志中已经可以看到它。我将在这里重复它们以重申:

错误的请求:

GET articles/pics2/201206/coolermaster-computex2012_70x70.jpg HTTP/1.1

正确的要求:

GET /articles/pics2/201206/coolermaster-computex2012_70x70.jpg HTTP/1.1

看到不同?前导斜线。事实证明,由于我自己笨拙的客户 url 处理,我在请求相对 url 时错过了它。但是通过快速而肮脏的修复,它现在可以正常工作了,直到我对客户的 url 进行适当的处​​理。

非常感谢您的评论,他们很有见地!

于 2012-06-25T21:17:16.443 回答
1

如果上述解决方案不起作用,请尝试删除 content-length 标头。内容长度不匹配导致正文解析器导致此错误

于 2020-03-29T16:27:23.687 回答