2

我正在尝试使用 Node.js 应用程序获取 HTML 页面的内容。我找到了这段代码:在 Node.js / Express 中,我如何“下载”页面并获取其 HTML?(yojimbo 回答),这似乎运作良好。当我尝试启动代码时,我得到了 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>

它是永久移动到同一个地方还是只是服务器上的某种安全措施?还是我在代码中犯了错误?(但它适用于谷歌和我测试的所有其他网站)。

我怀疑它是导致问题的“.xml”,因为我什至用 pdf 中的页面测试没有问题(只是一堆不可读的字符)。

在与客户讨论后,我将通过另一种方式(直接下载)获取该页面,这可以正常工作。我仍然接受 c.Pu.1 的答案,但我仍然想知道为什么重定向链接与应用程序遵循的链接相同。

4

2 回答 2

1

301 状态代码表示请求的资源已被移动,并且客户端必须执行重定向到响应的Location标头中包含的链接。默认情况下,该http模块不遵循重定向(状态代码 3xx)。

您可以使用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 响应标头中的“位置:”字段才能用于定位重定向的资源。

于 2013-07-30T15:48:13.440 回答