2013-05-22 12 views
44

Próbuję wykonać adres URL, który przekierowuje mnie na inną stronę przy użyciu nodejs request module.Jak uzyskać przekierowany adres URL z modułu żądania nodejs?

Przechodzenie przez dokumenty Nie znalazłem niczego, co pozwoliłoby na pobranie adresu URL po przekierowaniu.

Mój kod wygląda następująco:

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

}); 

Odpowiedz

46

Istnieją dwa bardzo proste sposoby na uzyskanie ostatniego adresu URL w łańcuchu przekierowań.

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

Uri to obiekt. uri.href zawiera adres URL, z parametrami zapytania, jako ciąg znaków.

Kod pochodzi z komentarzem na kwestię github życzenie Stwórcy: https://github.com/mikeal/request/pull/220#issuecomment-5012579

Przykład:

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

To będzie drukować http://www.google.com/?q=foo trzy razy (zauważ, że zostaliśmy przekierowani na adres z www z bez).

+0

Powiedziałeś, że powyższy kod przekierowuje trzy razy, skąd mam wiedzieć, który z nich jest ostatnią iteracją? – hitautodestruct

+1

Nie przekierowuje trzy razy. Drukuje adres URL, do którego przekierowano, na trzy różne sposoby. Przepraszam, jeśli to było niejasne. – gabrielf

+1

@gabrielf, Nie "this", ponieważ możemy użyć 'es6'. –

5

request dostaje przekierowań domyślnie, można go dostać za 10 przekierowań domyślnie. Możesz to sprawdzić w docs. Wadą tego jest to, że nie wiesz, czy adres URL jest domyślnie przekierowywany czy oryginalny.

Na przykład:

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

daje argumenty wyjściowe

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

ale jeśli dać opcję followRedirect jako fałszywą

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

daje

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

Nie martw się więc o przekierowanie zawartości. Ale jeśli chcesz się dowiedzieć, czy jest przekierowywany, czy nie, ustaw wartość false i sprawdź nagłówek location w odpowiedzi.

+0

Nie rozumiem Twojego ostatniego zdania: „Jeśli chcesz wiedzieć, czy jest przekierowany ustawić "followRedirect" na "false" "? Czy to nie powstrzymałoby procesu przekierowania? – hitautodestruct

+0

Domyślnie nie otrzymasz odpowiedzi 3xx z powodu automatycznego przekierowania. Więc jeśli chcesz wiedzieć, że zostałeś przekierowany/nie chcesz przekierowywać, musisz podać to jako fałszywe. To tylko po to, aby dowiedzieć się, jak przekierować. – user568109

+0

Zadaj sobie to pytanie, czy zostałeś przekierowany, czy nie (jak na początku)? musisz wiedzieć, co dostajesz, to przekierowanie (aka dreamworld) lub bezpośrednia strona (lub rzeczywistość). To jest twój totem;) – user568109

22

Aby znaleźć przekierowanie spróbuj tego:

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

Skończyło się tutaj po szukaniu "nie wykonuj przekierowań na żądanie w węźle", dzięki! Nie wiesz, jak włączyć tę opcję. – araneae

+5

'res.headers.location' wykonał zadanie dla mnie. – Felix

+2

Może nie działać zgodnie z oczekiwaniami, jeśli zaangażowane jest wiele przekierowań, dając pierwsze przekierowanie zamiast ostatniego. – Crazometer

0

Można skorzystać z formularza function followRedirects, tak:

options.followRedirects = 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

To wydaje się nie działać poprawnie w 'request 2.75.0' – loretoparisi

Powiązane problemy