2

Node.js アプリで HTML ページのコンテンツを取得しようとしています。このコードを見つけました: Node.js / Express で、ページを「ダウンロード」して HTML を取得するにはどうすればよいですか? (用心棒の答え)、うまくいくようです。コードを開始しようとすると、301 Moved Permanently という HTML 結果が表示されます。リダイレクト リンクは、送信したリンクと同じです。

var util = require("util"),
    http = require("http");

var options = {
    host: "www.mylink.com",
    port: 80,
    path: "/folder/content.xml"
};

var content = "";   

var req = http.request(options, function(res) {
    res.setEncoding("utf8");
    res.on("data", function (chunk) {
        content += chunk;
    });

    res.on("end", function () {
        util.log(content);
    });
});

req.end();

そして戻り値は次のとおりです。

30 Jul 13:08:52 - <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<p>The document has moved <a href="http://mylink.com/folder/content.xml"<here</a>.</p>
<hr>
<adress>Apache/2.2.22 (Ubuntu) Server at www.mylink.com Port 80</adress>
</body></html>

恒久的に同じ場所に移動されますか、それともサーバー上の何らかのセキュリティですか? または、コードを間違えましたか?(ただし、Googleおよび私がテストした他のすべてのサイトで動作します)。

問題なくpdfのページでテストしたので、問題を引き起こすのは「.xml」ではないかと思います(読み取り不能な文字の束だけです)。

クライアントとの話し合いの後、別の方法 (直接ダウンロード) でページを取得しますが、問題なく動作します。私はまだc.Pu.1の回答を受け入れていますが、なぜリダイレクトリンクがアプリがたどるリンクと同じなのか疑問に思っています。

4

2 に答える 2

1

301 ステータス コードは、要求されたリソースが移動されたこと、およびクライアントが応答のLocationヘッダーに含まれるリンクへのリダイレクトを実行する必要があることを示します。デフォルトでは、httpモジュールはリダイレクト (ステータス コード 3xx) に従いません。

リダイレクトを実行すると言われているrequestモジュールを使用できます。

Request は、http 呼び出しを行う最も簡単な方法になるように設計されています。HTTPS をサポートし、デフォルトでリダイレクトに従います。

手動で行うには、応答からLocationヘッダーを読み取り、その URI に対して新しい要求を開始します。

var req = http.request(options, function(res) {
    res.setEncoding("utf8");
    if(res.statusCode === 301 || res.statusCode === 302) {
        var newRequestUri = res.headers.location;
        http.request({hostname: newRequestUri}, function(res) {
            //read response
        }
    }
    res.on("data", function (chunk) {
        content += chunk;
    });

    res.on("end", function () {
        util.log(content);
    });
});
于 2013-07-30T11:52:01.667 に答える
0

"Location:" ヘッダーのリダイレクト リンクが最初に要求されたリンクと同じ場合、サーバーは正しく構成されていないか壊れています。

応答本文のリンクは、人間の利便性のためにのみ存在するものであり、信頼できるものと見なすべきではないことに注意してください。リダイレクトされたリソースを見つけるには、HTTP 応答ヘッダーの「Location:」フィールドのみを使用する必要があります。

于 2013-07-30T15:48:13.440 に答える