2013-07-30 2 views
0

Я пытаюсь получить содержимое HTML-страницы с приложением Node.js. Я нашел этот код: In Node.js/Express, how do I "download" a page and gets its HTML? (yojimbo ответ), который, кажется, работает хорошо. Когда я пытаюсь запустить код, я получаю результат HTML из 301 Moved Permanentently, гайка, ссылка перенаправления такая же, как и я, которую я отправил!Получение html ошибки 301, которые возвращают ту же самую ссылку

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 и на всех других сайтах, которые я тестировал).

Сомневаюсь, что это «.xml», который вызывает проблему, так как я даже протестировал со страницей в pdf без проблем (просто куча нечитаемых символов).

После обсуждения с клиентом, я получу страницу по-другому (загружая ее напрямую), которая работает нормально. Я все еще согласен с ответом на c.Pu.1, но мне все еще интересно, почему ссылка на перенаправление совпадает с ссылкой, к которой идет приложение.

+0

Обратите внимание, что вы запрашиваете '/ folder/content.xml' и перенаправляете на'/folder.content.xml'. Это не тот же URL. – Nefreo

+0

Извините, это опечатка, мне пришлось переписать сообщение с другого компьютера. – DrakaSAN

ответ

1

Код статуса 301 указывает, что запрашиваемый ресурс был перемещен и что клиент должен выполнить перенаправление на ссылку, включенную в ответ . Местонахождение. Модуль http не выполняет переадресацию (коды состояния 3xx) по умолчанию.

Вы можете использовать модуль request, который, как говорят, выполняет перенаправления.

Запрос разработан, чтобы быть простейшим способом сделать http звонков. Он поддерживает HTTPS и после перенаправления по умолчанию.

Чтобы сделать это вручную, прочитайте Расположение заголовок из ответа и инициировать новый запрос на этот 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); 
    }); 
}); 
+0

Я мог бы это сделать, но меня это заинтриговало, что я получаю ту же самую ссылку на странице переадресации. – DrakaSAN

0

Если ссылка редиректа в «Location:» заголовок такой же, как первоначально запрошенной связи, то сервер либо неправильно или поврежден.

Обратите внимание, что ссылка в корпусе ответа только для удобства людей и не должна считаться авторитетной. Только поле «Местоположение:» в заголовке HTTP-ответа должно использоваться для поиска перенаправленного ресурса.

Смежные вопросы