Erhalten Sie die endgültige URL, nachdem Curl umgeleitet wurde


110

Ich muss die endgültige URL nach einer Seitenumleitung erhalten, vorzugsweise mit Curl oder Wget.

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

Der Inhalt ist leicht zu bekommen (zB curl --max-redirs 10 http://google.com -L), aber ich interessiere mich nur für die endgültige URL (im ersteren Fall http://www.google.com ).

Gibt es eine Möglichkeit, dies nur mit integrierten Linux-Tools zu tun? (nur Befehlszeile)

Antworten:


190

curlDie -wOption und die Untervariable sind genau url_effectivedas, wonach Sie suchen.

Etwas wie

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

Mehr Info

-L Weiterleitungen folgen
-s Silent-Modus. Gib nichts aus
-o DATEI Schreibe die Ausgabe in <Datei> anstelle von stdout
-w FORMAT Was soll nach Abschluss ausgegeben werden?

Mehr

Möglicherweise möchten Sie auch hinzufügen -I(das ist ein Großbuchstabe i), wodurch der Befehl keinen "Körper" herunterlädt, sondern dann auch die HEAD-Methode verwendet, die nicht in der Frage enthalten ist, und das Risiko besteht, dass sich die Funktionsweise des Servers ändert. Manchmal reagieren Server nicht gut auf HEAD, selbst wenn sie gut auf GET reagieren.


4
Sie sollten in der Lage sein, "-o / dev / null" zu verwenden, wenn Sie die Datei nicht möchten
Gavin Mogan

1
Das ist eine großartige Option, ich hätte nie gedacht, dass Curl das kann! Es hört nie auf, mich zu überraschen:-)
Josh

1
Das ist eher eine Shell-Funktion als Curl
user151841

1
@ DanielStenberg, den Sie benötigen, -Isonst wird die Datei tatsächlich heruntergeladen.
Steven Penny

2
Einige Websites benötigen außerdem einen gefälschten Benutzeragenten curl -A ..., um zum erwarteten Speicherort umzuleiten.
Ivan Kozik

29

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

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

Dies ermöglichte es, den Befehl aus anderen Skripten wie diesen aufzurufen:

echo `finalurl http://someurl/`

2
Danke für diese Ideen. Ich habe es für die Terminalverwendung in meiner .bashrc-Datei als Funktion umgeschrieben, und die knappen Optionen in dieser Datei sind nicht erforderlich. Daher habe ich die langen Namen verwendet, um dies selbst zu dokumentieren:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

6

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 über den ersten hinaus.


6

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

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


-O /dev/nullNur von bis ersetzen -O-. Besser:wget -O- --content-disposition example.com
Maxwel Leite

1
wget -O / dev / null --content-disposition example.com und wget -O- / dev / null --content-disposition example.com erzeugen viel mehr Ausgabe als die umgeleitete URL. curl $ 1 -s -L -I -o / dev / null -w '% {url_effective}' funktioniert gut für mich.
Eric Klien

5

Danke dir. 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, aber das ist gut genug für mich, da es bei aufeinanderfolgenden Weiterleitungen funktioniert.

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


2

Die Parameter -L (--location)und -I (--head)immer noch unnötige HEAD-Anfrage an die Location-URL.

Wenn Sie sicher sind, dass Sie nicht mehr als eine Umleitung 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 weiterleiten

1. Mit Verfolgungsort

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

Scheint ziemlich ungewöhnlich, dass Sie im Voraus wissen würden, dass es nur eine Weiterleitung geben würde ...
SamB

1

Ich bin nicht sicher, wie ich es mit Curl machen soll, 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

1

Das würde funktionieren:

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

0

Kannst du es versuchen?

#!/bin/bash 
LOCATION=`curl -I 'http://your-domain.com/url/redirect?r=something&a=values-VALUES_FILES&e=zip' | perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 
echo "$LOCATION"

Hinweis: Wenn Sie den Befehl curl -I ausführen, muss http://your-domain.com einfache Anführungszeichen im Befehl like verwenden curl -I 'http://your-domain.com'


-3

Sie könnten grep verwenden. Wget sagt dir nicht, wo es auch umleitet? Grep das einfach raus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.