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)
curl
s -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.
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}'
/dev/null
Dadurch war es möglich, den Befehl aus anderen Skripts wie folgt aufzurufen:
echo `finalurl http://someurl/`
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
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.
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.
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
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"
all_videos_link.txt
- 50 Links von goo.gl + bit.ly, die zu youtube umleiten
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
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
Das würde funktionieren:
curl -I somesite.com | Perl -n -e '/^Location: (.*)$/ && print "$1\n"'