curlがリダイレクトされた後に最終URLを取得する


110

できればcurlまたはwgetを使用してページをリダイレクトした後、最終的なURLを取得する必要があります。

たとえば、http //google.comhttp://www.google.comにリダイレクトする場合があります

内容は簡単に取得できます(例curl --max-redirs 10 http://google.com -L)が、私は最終的なURL(前者の場合はhttp://www.google.com)だけに興味があります

Linuxの組み込みツールのみを使用してこれを行う方法はありますか?(コマンドラインのみ)

回答:


191

curl-wオプションとサブ変数url_effectiveはあなたが探しているものです。

何かのようなもの

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

より詳しい情報

-Lリダイレクトに従う
-sサイレントモード。何も出力しない
-o FILE出力をstdoutではなく<file>に書き込みます
-w FORMAT完了後に出力するもの

もっと

追加-I(つまり、大文字i)を追加することもできます。これにより、コマンドで「本体」がダウンロードされなくなりますが、HEADメソッドも使用されます。これは、質問に含まれていないため、サーバーの動作を変更するリスクがあります。サーバーは、GETにうまく応答しても、HEADにうまく応答しない場合があります。


4
ファイルが必要ない場合は、「-o / dev / null」を使用できるはずです
Gavin Mogan

1
これは素晴らしいオプションです。curlがそれを実行できるとは知りませんでした。それは私を驚かせるのをやめることはありません:-)
ジョシュ

1
それはcurlよりもシェル機能の詳細です
user151841

1
@DanielStenberg必要な-I場合は実際にファイルをダウンロードします。
スティーブンペニー2014年

2
一部のWebサイトでcurl -A ...は、予想される場所にリダイレクトするために、偽装されたユーザーエージェントも必要です。
Ivan Kozik 2018年

29

ありがとう、それは私を助けました。私はいくつかの改良を加え、それをヘルパースクリプト「finalurl」にラップしました。

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o に出力 /dev/null
  • -I 実際にはダウンロードせず、最終的なURLを見つけてください
  • -s サイレントモード、プログレスバーなし

これにより、次のような他のスクリプトからコマンドを呼び出すことが可能になりました。

echo `finalurl http://someurl/`

2
それらのアイデアをありがとう。:私は、この自己文書に長い名前を使用するので、私は機能としての私の.bashrcファイルに端末使用のためにそれを書き直して、そのファイル内の簡潔なオプションの必要はありませんfinalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

別のオプションとして:

$ 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>

しかし、それは最初のものを超えません。


6

通常、これはwgetで実行できます。 wget --content-dispositionさらに「url」を追加-O /dev/nullすると、実際にはファイルが保存されません。

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


から-O /dev/nullのみに置き換え-O-ます。より良い:wget -O- --content-disposition example.com
Maxwel Leite

1
wget -O / dev / null --content-disposition example.comおよびwget -O- / dev / null --content-disposition example.comは、リダイレクトされたURLよりも多くの出力を生成します。curl $ 1 -s -L -I -o / dev / null -w '%{url_effective}'が適切に機能します。
Eric Klien

5

ありがとうございました。私はあなたの提案を実装することになりました: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

Webサイトがリダイレクトしない場合は空白を返しますが、それは連続したリダイレクトで機能するので十分です。

バギーかもしれませんが、一見大丈夫です。


2

これはうまくいくでしょう:

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

2

パラメータ-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"

スピードテスト

all_videos_link.txt -YouTubeにリダイレクトするgoo.gl + bit.lyの50リンク

1.追跡場所を使用

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

結果:

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

2.フォロー位置なし

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

結果:

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

リダイレクトが1つしかないことを事前に知っていることはかなり珍しいようです...
SamB

1

curlでそれを行う方法はわかりませんが、libwww-perlは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

0

試して頂けますか?

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

注:コマンドcurl -I http://your-domain.comを実行する場合、次のようなコマンドでは一重引用符を使用する必要があります。 curl -I 'http://your-domain.com'


-3

grepを使用できます。wgetはリダイレクト先も教えてくれませんか?ちょうどそれをグレップ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.