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

问题描述 投票:0回答:6

我正在尝试跟踪一个使用nodejs 请求模块将我重定向到另一个页面的URL。

梳理文档,我找不到任何可以让我在重定向后检索 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 );

});
node.js module request
6个回答
88
投票

有两种非常简单的方法可以获取重定向链中的最后一个网址。

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 的地址重定向到带 www 的地址)。


36
投票

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

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

6
投票

request
默认获取重定向,默认可以通过10个重定向。您可以在docs中检查这一点。这样做的缺点是,默认情况下您不知道获得的 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>

所以不用担心获取重定向的内容。但如果您想知道它是否被重定向或未设置

followRedirect
false,请检查响应中的
location
标头。


3
投票

如果你使用axios,你可以像下面这样获取重定向的url,

 axios({
        method: 'GET',
        url: URL,
        params: {
        }
    })
        .then((response) => {
            return response.request._redirectable._options.href;
        })
        .catch(error => {
            return error;
        });

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
});

0
投票

在 Google 网上论坛上找到了一个解决方案,其中讨论了 GitHub 上提供的答案中的代码错误更正。这个使用普通的 JavaScript。这是代码:

var sys = require('system'); var pageUrl = ( sys.args[1] ) ? sys.args[1] : phantom.exit(0); function forceExit(){ phantom.exit(0); } var renderPage = function (url) { var page = require('webpage').create(); page.onNavigationRequested = function(url, type, willNavigate, main) { var tmpUrl = ( url.substr(url.length - 1) != '/' ) ? url+'/' : url; var tmpPageUrl = ( pageUrl.substr( pageUrl.length - 1) != '/' ) ? pageUrl+'/' : pageUrl; console.log(tmpUrl,tmpPageUrl); if (main && tmpUrl!=tmpPageUrl ) { pageUrl = url; sys.stdout.write(url+'\n'); setTimeout(forceExit,100 ); } }; page.open(url, function(status) { if ( status !== 'success' ) { phantom.exit( 1 ); } else { phantom.exit( 0 ); } },100); setTimeout(forceExit,2000 ); }; renderPage( pageUrl );
    
© www.soinside.com 2019 - 2024. All rights reserved.