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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16687618/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 14:33:55  来源:igfitidea点击:

How do I get the redirected url from the nodejs request module?

node.jsmodulerequest

提问by hitautodestruct

I'm trying to follow through on a url that redirects me to another page using the nodejs request module.

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

Combing through the docs I could not find anything that allows me to retrieve the url after the redirect.

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

My code is as follows:

我的代码如下:

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

});

回答by gabrielf

There are two very easy ways to get hold of the last url in a chain of redirects.

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

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

The uri is a object. uri.href contains the url, with query parameters, as a string.

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

The code comes from a comment on a github issue by request's creator: https://github.com/mikeal/request/pull/220#issuecomment-5012579

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

Example:

例子:

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

This will print http://www.google.com/?q=foothree times (note that we were redirected to an address with www from one without).

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

回答by Michael

To find the redirect url try this:

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

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

回答by user568109

requestgets redirects by default, it can get through 10 redirects by default. You can check this in the docs. Downside of this is that you would not know if url you get is a redirected one or original one by default options.

request默认获取重定向,默认可以通过10个重定向。您可以在docs 中检查这一点。这样做的缺点是,默认情况下,您不知道您获得的 url 是重定向的还是原始的。

For example:

例如:

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

gives output

给出输出

> { 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' }

but if you give option followRedirectas false

但如果你给选项followRedirect错误

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

it gives

它给

> { 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>

So don't worry about getting the redirected content. But if you want to know if it is redirected or not set followRedirectfalse and check the locationheader in the response.

所以不要担心获得重定向的内容。但是,如果您想知道它是否被重定向或未设置为followRedirectfalse 并检查location响应中的标头。

回答by Flimm

You can use the function form for followRedirect(rather than followAllRedirects), like this:

您可以使用 for 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
});