如何从nodejs请求模块获取重定向的URL?


73

我正在尝试遵循一个使用nodejs request模块将我重定向到另一个页面的URL 。

梳理文档后,我找不到任何可以让我在重定向后检索网址的内容。

我的代码如下:

var request = require("request"),
    options = {
      uri: 'http://www.someredirect.com/somepage.asp',
      timeout: 2000,
      followAllRedirects: true
    };

request( options, function(error, response, body) {

    console.log( response );

});

Answers:


79

有两种非常简单的方法来获取重定向链中的最后一个URL。

var r = request(url, function (e, response) {
  r.uri
  response.request.uri
})

uri是一个对象。uri.href包含带有查询参数的URL作为字符串。

该代码来自请求创建者对github问题的评论:https : //github.com/mikeal/request/pull/220#issuecomment-5012579

例:

var request = require('request');
var r = request.get('http://google.com?q=foo', function (err, res, body) {
  console.log(r.uri.href);
  console.log(res.request.uri.href);

  // Mikael doesn't mention getting the uri using 'this' so maybe it's best to avoid it
  // please add a comment if you know why this might be bad
  console.log(this.uri.href);
});

这将打印三次http://www.google.com/?q=foo(请注意,我们从一个不带重定向到带有www的地址)。


1
您说上面的代码重定向了3次,我怎么知道最后一次迭代是哪个运行?
hitautodestruct

1
它不会重定向三遍。它以三种不同的方式打印重定向到的URL。抱歉,如果不清楚。
gabrielf

1
@gabrielf,不this,因为我们可能使用es6
盖拉夫·甘地

2
res.request.uri.href会崩溃,如果给定的URL是坏的网址,如“sdfdsfdgdfgdfgdfg.sdfsdfsdf”,所以要么你可以检查err或存在res,如果你想使用这个选项。
Sumit Kumar

33

要找到重定向网址,请尝试以下操作:

var url = 'http://www.google.com';
request({ url: url, followRedirect: false }, function (err, res, body) {
  console.log(res.headers.location);
});

在寻找“不要在节点中的请求中遵循重定向”后结束此处,谢谢!不确定如何包括该选项。
araneae 2014年

8
res.headers.location为我做了工作。
费利克斯

5
如果涉及多个重定向,则第一个重定向而不是最后一个重定向可能无法按预期方式工作。
Crazometer

6

request默认情况下获取重定向,默认情况下可以通过10个重定向。您可以在docs中。缺点是您不知道默认情况下获取的URL是重定向的URL还是原始的URL。

例如:

request('http://www.google.com', function (error, response, body) {
    console.log(response.headers) 
    console.log(body) // Print the google web page.
})

提供输出

> { date: 'Wed, 22 May 2013 15:11:58 GMT',
  expires: '-1',
  'cache-control': 'private, max-age=0',
  'content-type': 'text/html; charset=ISO-8859-1',
  server: 'gws',
  'x-xss-protection': '1; mode=block',
  'x-frame-options': 'SAMEORIGIN',
  'transfer-encoding': 'chunked' }

但是如果您选择 followRedirect为false

request({url:'http://www.google.com',followRedirect :false}, function (error, response, body) {
    console.log(response.headers) 
    console.log(body)
});

它给

> { location: 'http://www.google.co.in/',
  'cache-control': 'private',
  'content-type': 'text/html; charset=UTF-8',
  date: 'Wed, 22 May 2013 15:12:27 GMT',
  server: 'gws',
  'content-length': '221',
  'x-xss-protection': '1; mode=block',
  'x-frame-options': 'SAMEORIGIN' }
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.in/">here</A>.
</BODY></HTML>

因此,不必担心获取重定向的内容。但是,如果您想知道它是否已重定向或设置为followRedirectfalse,请检查location响应中的标头。


我不明白您的最后一句话“如果您想知道是否将其重定向设置followRedirectfalse”?那不会停止重定向过程吗?
hitautodestruct

默认情况下,由于自动重定向,您不会收到3xx响应。因此,如果您想知道自己已被重定向/不想重定向,则必须将其设置为false。它仅用于查找重定向。
user568109 2013年

1
问问自己,您是否被重定向(例如在开始时)?您需要知道所获得的是重定向(又称Dreamworld)或直接页面(或现实)。这是你的图腾;)
user568109

0

您可以将函数形式用于followRedirect(而不是followAllRedirects),如下所示:

options.followRedirect = function(response) {
  var url = require('url');
  var from = response.request.href;
  var to = url.resolve(response.headers.location, response.request.href);
  return true;
};

request(options, function(error, response, body) {
  // normal code
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.