192 votes

Obtenir l'URL finale après la redirection de curl

J'ai besoin d'obtenir l'URL finale après une redirection de page, de préférence avec curl ou wget.

Par exemple http://google.com peut rediriger vers http://www.google.com .

Le contenu est facile à obtenir (ex. curl --max-redirs 10 http://google.com -L ), mais je ne m'intéresse qu'à l'url finale (dans le premier cas http://www.google.com ).

Existe-t-il un moyen d'y parvenir en utilisant uniquement les outils intégrés à Linux ? (ligne de commande uniquement)

5voto

Geograph Points 871

Les paramètres -L (--location) et -I (--head) toujours en faisant une requête HEAD inutile à l'adresse location-url.

Si vous êtes sûr de ne pas avoir plus d'une redirection, il est préférable de désactiver le suivi de l'emplacement et d'utiliser une variable curl %{redirect_url}.

Ce code ne fait qu'une seule requête HEAD à l'URL spécifiée et prend redirect_url dans location-header :

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

Test de vitesse

all_videos_link.txt - 50 liens de goo.gl+bit.ly qui redirigent vers youtube

1. Avec emplacement de suivi

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

Résultats :

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

2. Sans localisation de suivi

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

Résultats :

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

4voto

Dave Baird Points 123

curl ne peut suivre que les redirections http. Pour suivre également les directives meta refresh et les redirections javascript, vous avez besoin d'un navigateur complet comme headless chrome :

#!/bin/bash
real_url () {
    printf 'location.href\nquit\n' | \
    chromium-browser --headless --disable-gpu --disable-software-rasterizer \
    --disable-dev-shm-usage --no-sandbox --repl "$@" 2> /dev/null \
    | tr -d '>>> ' | jq -r '.result.value'
}

Si chrome n'est pas installé sur votre ordinateur, vous pouvez l'utiliser à partir d'un conteneur Docker :

#!/bin/bash
real_url () {
    printf 'location.href\nquit\n' | \
    docker run -i --rm --user "$(id -u "$USER")" --volume "$(pwd)":/usr/src/app \
    zenika/alpine-chrome --no-sandbox --repl "$@" 2> /dev/null \
    | tr -d '>>> ' | jq -r '.result.value'
}

Comme cela :

$ real_url http://dx.doi.org/10.1016/j.pgeola.2020.06.005 
https://www.sciencedirect.com/science/article/abs/pii/S0016787820300638?via%3Dihub

3voto

Mike Q Points 461

Cela fonctionnerait :

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

1voto

halkeye Points 857

Je ne sais pas comment faire avec curl, mais libwww-perl installe l'alias GET.

$ 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

1voto

lakshmikandan Points 2088

Pouvez-vous essayer ?

#!/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"

Remarque : lorsque vous exécutez la commande curl -I http://your-domain.com doit utiliser des guillemets simples dans la commande comme curl -I 'http://your-domain.com'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X