curlでURLのリダイレクトターゲットを取得する


24

単一のURLがリダイレクトする場所を確認したいと思います。その例としては、Googleの検索結果ページからのリンク(クリックが常にGoogleサーバーを通過する場所)があります。

でできますcurlか?

回答:


18

これを試して:

$ LOCATION=`curl -I http://raspberrypi.stackexchange.com/a/1521/86 | perl -n -e '/^Location: (.*)$/ && print "$1\n"'`
$ echo "$LOCATION"
/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521#1521

Googleリダイレクト

GoogleリダイレクトURLはわずかに異なります。Javascriptリダイレクトを返しますが、これは簡単に処理できますが、元のURLを処理してgo curlを一緒に処理しないのはなぜですか?

$ URL="http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http%3A%2F%2Fwww.raspberrypi.org%2F&ei=rv8oUODIIMvKswa4xoHQAg&usg=AFQjCNEBMoebclm0Gk0LCZIStJbF04U1cQ"
$ LOCATION=`echo "$URL" | perl -n -e '/url=([a-zA-Z0-9%\.]*)/ && print "$1\n"'`
$ echo "$LOCATION"
http%3A%2F%2Fwww.raspberrypi.org%2F
$ echo "$LOCATION" | perl -pe 's/%([0-9a-f]{2})/sprintf("%s", pack("H2",$1))/eig'
http://www.raspberrypi.org/

参照

  1. URLデコードの場合...

特殊文字を含む特殊なURL(Googleのリダイレクトなど)はどうでしょうか。例:google.com/…–
syntagma

@REACHUSリダイレクトは、指定されたURLのクエリ文字列にエンコードされます。
アレックスチェンバレン

@REACHUS心配なし-おそらく2つのperlステートメントを組み合わせることができます。
アレックスチェンバレン

20

さらに簡単な方法があります

curl -w "%{url_effective}\n" -I -L -s -S $URL -o /dev/null

印刷するだろう

http://raspberrypi.stackexchange.com/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521

URL用

http://raspberrypi.stackexchange.com/a/1521/86

3
ただし、2番目のページもダウンロードするため、より多くの時間と帯域幅を使用します。
アンハンマー

1
@unhammerあなたは正しいです、ヘッドリクエストのみを行うために私の答えを更新しました。
-ismail

7

curlは、リダイレクトに従い、完了後に変数を出力するように構成できます。そのため、次のコマンドを使用して、要求を達成できます。

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

マニュアルページでは、次のような必要なパラメータについて説明しています。

-L, --location          Follow redirects (H)
-s, --silent            Silent mode (don't output anything)
-w, --write-out FORMAT  Use output FORMAT after completion
-o, --output FILE       Write to FILE instead of stdout

4

またはこれを試してください

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86

特別な文字(Googleのリダイレクトなど)を含む特別なURLはどうですか。例:google.com/…–
syntagma

シェルがリンク内の特殊文字を無視するように、URLを単一引用符で囲んでください。ただし、指定したリンクは別のURIにリダイレクトされません。応答のステータスコードは3xxではなく200です。探しているuriは、応答のコンテンツにそれぞれuri自体に隠されています。さらに調査するために、応答のヘッダーと応答curl -s -I 'http://yoururl'のコンテンツを調べることができますcurl -s 'http://yoururl'(Googleがリダイレクトに単純なJavaScriptを使用していることがわかります)。
user1146332

0

パラメーター-L (--location)-I (--head)、location-urlへの不要なHEAD要求を引き続き実行します。

リダイレクトが1つしかないことが確実な場合は、フォローロケーションを無効にし、curl変数%{redirect_url}を使用することをお勧めします。

このコードは、指定されたURLに対してHEADリクエストを1つだけ実行し、location-headerからredirect_urlを取得します。

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.