3

StackOverflowコミュニティの皆さん、こんにちは。

私は最近Node.jsを学び始め、タスクとして逆HTTPプロキシを実装することにしました。自分でなんとか乗り越えられた荒れた場所がいくつかありましたが、今は少し行き詰まっていて、あなたの助けが必要です。リダイレクトと相対URLを処理することができましたが、相対URLサポートを実装すると、これから説明する問題に直面しました。

私のコードはhttp://pastebin.com/vZfEfk8rにあります。それほど大きくはありませんが、それでもこのページにうまく収まりません。

だから問題に(それらの2つがあります)。http.requestを使用してクライアントの要求をターゲットサーバーに転送し、応答を待ってこの応答をクライアントに送り返しています。一部のリクエストでは問題なく機能しますが、他のリクエストでは機能しません。これが最初の問題です。プロキシのテストに使用しているWebサイト(http://ixbt.com、技術に関するクールなロシアのWebサイト)では、メインページ/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)である可能性があるかということです。

もう1つの懸念は、スタンドアロンリクエストと同じファイルを取得しようとしても、問題がないことです。見てください:

リクエスト:

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>

ブラウザがリバースプロキシURLで送信しているため、「referer」ヘッダーを手動で作成する必要がありました。ご覧のとおり、それでも動作は同じです。他のアイデアはありますか?

4

2 に答える 2

5

貴重なコメントのおかげで、私はこの問題の答えを見つけることができました。これは、ノードまたはターゲット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 に答える