我正在尝试跟踪一个使用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 );
});
有两种非常简单的方法可以获取重定向链中的最后一个网址。
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 的地址)。
要查找重定向网址,请尝试以下操作:
var url = 'http://www.google.com';
request({ url: url, followRedirect: false }, function (err, res, body) {
console.log(res.headers.location);
});
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
标头。
如果你使用axios,你可以像下面这样获取重定向的url,
axios({
method: 'GET',
url: URL,
params: {
}
})
.then((response) => {
return response.request._redirectable._options.href;
})
.catch(error => {
return error;
});
您可以使用
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
});
在 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 );