2010-06-19 9 views
63

Ich brauche die endgültige URL nach einer Seite Redirect vorzugsweise mit curl oder wget.Get URL nach curl wird umgeleitet

Zum Beispiel http://google.com kann http://www.google.com umleiten.

Die Inhalte sind leicht zu bekommen (ex. curl --max-redirs 10 http://google.com -L), aber ich bin nur an der endgültigen URL interessiert (im ehemaligen Fall http://www.google.com).

Gibt es eine Möglichkeit, dies zu tun, indem Sie nur Linux-Build-Tools verwenden? (nur Befehlszeile)

Antwort

93

curl ‚s -w Option und die Unter Variable url_effective ist, was Sie sind gesucht haben.

So etwas wie

curl -Ls -o /dev/null -w %{url_effective} http://google.com 

Mehr Infos

 
-L   Follow redirects 
-s   Silent mode. Don't output anything 
-o FILE Write output to <file> instead of stdout 
-w FORMAT What to output after completion 

Mehr

Sie könnten -I hinzufügen möchten (das ist ein Groß 'i') als auch, was machen Der Befehl lädt keine "Körper", aber es verwendet auch die HEAD-Methode, die nicht die Frage enthalten und das Risiko ändert was der Server macht. Manchmal reagieren Server nicht gut auf HEAD, selbst wenn sie auf GET reagieren.

+4

Sie sollten "-o/dev/null" verwenden, wenn Sie die Datei nicht wollen –

+0

Das ist eine gute Option ist, ich wusste nie Curl könnte das tun! Es hört nie auf, mich zu erstaunen ':-)' – Josh

+1

Das ist eher eine Shell-Funktion als Curl – user151841

-2

Sie könnten Grep verwenden. Weißt du nicht, wo es auch umleitet? Greife das einfach aus.

2

Ich bin mir nicht sicher, wie es mit curl zu tun ist, aber libwww-perl installiert den GET-Alias.

$ GET -S -d -e http://google.com 
GET http://google.com --> 301 Moved Permanently 
GET http://www.google.com/ --> 302 Found 
GET http://www.google.ca/ --> 200 OK 
Cache-Control: private, max-age=0 
Connection: close 
Date: Sat, 19 Jun 2010 04:11:01 GMT 
Server: gws 
Content-Type: text/html; charset=ISO-8859-1 
Expires: -1 
Client-Date: Sat, 19 Jun 2010 04:11:01 GMT 
Client-Peer: 74.125.155.105:80 
Client-Response-Num: 1 
Set-Cookie: PREF=ID=a1925ca9f8af11b9:TM=1276920661:LM=1276920661:S=ULFrHqOiFDDzDVFB; expires=Mon, 18-Jun-2012 04:11:01 GMT; path=/; domain=.google.ca 
Title: Google 
X-XSS-Protection: 1; mode=block 
4

als eine weitere Option:

$ curl -i http://google.com 
HTTP/1.1 301 Moved Permanently 
Location: http://www.google.com/ 
Content-Type: text/html; charset=UTF-8 
Date: Sat, 19 Jun 2010 04:15:10 GMT 
Expires: Mon, 19 Jul 2010 04:15:10 GMT 
Cache-Control: public, max-age=2592000 
Server: gws 
Content-Length: 219 
X-XSS-Protection: 1; mode=block 

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>301 Moved</TITLE></HEAD><BODY> 
<H1>301 Moved</H1> 
The document has moved 
<A HREF="http://www.google.com/">here</A>. 
</BODY></HTML> 

Aber es geht nicht vorbei an der ersten.

3

Vielen Dank. Ich beenden Ihre Vorschläge Umsetzung bis: curl -i + grep

curl -i http://google.com -L | egrep -A 10 '301 Moved Permanently|302 Found' | grep 'Location' | awk -F': ' '{print $2}' | tail -1 

Returns leer, wenn die Website umleiten nicht, aber das ist gut genug für mich, da es an aufeinander folgenden Umleitungen funktioniert.

Könnte fehlerhaft sein, aber auf einen Blick funktioniert es gut.

18

Danke, das hat mir geholfen.Ich habe einige Verbesserungen und gewickelt, dass in einem Hilfsskript "finalurl":

#!/bin/bash 
curl $1 -s -L -I -o /dev/null -w '%{url_effective}' 
  • -o Ausgabe /dev/null
  • -I eigentlich gar nicht downloaden, entdecken gerade die endgültige URL
  • es silent-Modus, keine Fortschrittsbalken

Dies machte es möglich, den Befehl von anderen Skripten wie folgt aufzurufen:

echo `finalurl http://someurl/` 
+1

Danke für diese Ideen. Ich habe es für die Terminal-Verwendung in meiner .bashrc-Datei als Funktion neu geschrieben, und es gibt keine Notwendigkeit für die knappen Optionen in dieser Datei, also habe ich die langen Namen verwendet, um dies zu dokumentieren: 'finalurl() {curl --silent - Standort --head --output/dev/null --write-out '% {url_effective}' - "$ @"; } ' – buggy3

5

Sie können dies normalerweise mit wget tun. wget --content-disposition "url" zusätzlich, wenn Sie -O /dev/null hinzufügen, werden Sie nicht wirklich die Datei speichern.

wget -O /dev/null --content-disposition example.com

0

Dies funktionieren würde:

curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'