76

nodejs request moduleを使用して別のページにリダイレクトする 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 );

});
4

5 に答える 5

84

一連のリダイレクトの最後の URL を取得するには、2 つの非常に簡単な方法があります。

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が3 回出力されます (www のないアドレスから www のあるアドレスにリダイレクトされたことに注意してください)。

于 2013-06-28T10:48:16.487 に答える
34

リダイレクト URL を見つけるには、これを試してください。

var url = 'http://www.google.com';
request({ url: url, followRedirect: false }, function (err, res, body) {
  console.log(res.headers.location);
});
于 2013-12-22T22:58:55.297 に答える
6

requestデフォルトでリダイレクトを取得し、デフォルトで 10 回のリダイレクトを取得できます。これはdocsで確認できます。これの欠点は、デフォルトのオプションでは、取得した 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>

したがって、リダイレクトされたコンテンツの取得について心配する必要はありません。followRedirectただし、リダイレクトされているか、false に設定されていないかを知りたい場合はlocation、応答のヘッダーを確認してください。

于 2013-05-22T15:19:52.827 に答える
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
});
于 2015-09-24T15:13:22.977 に答える