it-swarm.com.de

Holen Sie sich eine URL, nachdem die Umleitung umgeleitet wurde

Ich muss die endgültige URL nach einer Seitenumleitung vorzugsweise mit curl oder wget abrufen.

Beispielsweise kann http://google.com zu http://www.google.com umleiten.

Der Inhalt ist leicht zu erhalten (z. B. curl --max-redirs 10 http://google.com -L), aber ich interessiere mich nur für die abschließende URL (im vorherigen Fall http://www.google.com ).

Gibt es eine Möglichkeit, dies zu tun, indem nur Linux-Buildin-Tools verwendet werden? (nur Befehlszeile)

75
vise

curls -w-Option und die Untervariable url_effective sind das, wonach Sie suchen

So etwas wie

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

Mehr Info

- L Weiterleitungen folgen 
- s Lautlosmodus. Nichts ausgeben 
- o FILE Ausgabe in <Datei> statt in stdout 
- w FORMAT Was wird nach Beendigung ausgegeben 

Mehr

Möglicherweise möchten Sie auch -I (das ist ein i in Großbuchstaben__) hinzufügen, wodurch der Befehl keinen "body" herunterlädt, er verwendet jedoch auch die Methode HEAD Frage eingeschlossen und Gefahr zu ändern, was der Server tut. Manchmal reagieren Server nicht gut auf HEAD, auch wenn sie gut auf GET reagieren.

137
Daniel Stenberg

Danke, das hat mir geholfen. Ich habe einige Verbesserungen vorgenommen und das in ein Hilfsskript "finalurl" verpackt:

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o Ausgabe an /dev/null
  • -Ich lade nicht wirklich herunter, finde nur die endgültige URL
  • -s Silent-Modus, keine Fortschrittsbalken

Dadurch war es möglich, den Befehl aus anderen Skripts wie folgt aufzurufen:

echo `finalurl http://someurl/`
20
Jan Koriťák

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

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

6
Ceagle

als 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 an der ersten vorbei.

5
Gavin Mogan

Vielen Dank. Am Ende habe ich Ihre Vorschläge umgesetzt: 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

Gibt leer zurück, wenn die Website nicht umgeleitet wird. Dies ist jedoch gut genug für mich, da sie bei aufeinanderfolgenden Weiterleitungen funktioniert.

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

3
vise

Ich bin nicht sicher, wie es mit curl geht, 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
2
Gavin Mogan

Die Parameter -L (--location) und -I (--head) stellen weiterhin unnötige HEAD-Anfragen an die Location-URL.

Wenn Sie sicher sind, dass Sie nicht mehr als eine Weiterleitung haben, ist es besser, die Verfolgungsposition zu deaktivieren und eine Curl-Variable% {redirect_url} zu verwenden.

Dieser Code führt nur eine HEAD-Anfrage an die angegebene URL aus und übernimmt redirect_url aus dem Location-Header:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://""goo.gl/QeJeQ4"

Geschwindigkeitstest

all_videos_link.txt - 50 Links von goo.gl + bit.ly, die zu youtube umleiten

1. Mit folgendem Standort

time while read -r line; do
    curl -kIsL -w "%{url_effective}\n" -o /dev/null  $line
done < all_videos_link.txt

Ergebnisse:

real    1m40.832s
user    0m9.266s
sys     0m15.375s

2. Ohne Ort zu folgen

time while read -r line; do
    curl -kIs -w "%{redirect_url}\n" -o /dev/null  $line
done < all_videos_link.txt

Ergebnisse:

real    0m51.037s
user    0m5.297s
sys     0m8.094s
0
Geograph

Das würde funktionieren:

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