できればcurlまたはwgetでページをリダイレクトした後、最終的なURLを取得する必要があります。
たとえば、http://google.comはhttp://www.google.com。
内容は簡単に取得できます(例:curl --max-redirs 10 http://google.com -L
)、しかし、私は最終URLのみに興味があります(前者の場合 http://www.google.com )。
Linuxの組み込みツールのみを使用してこれを行う方法はありますか? (コマンドラインのみ)
curl
の-w
オプションとサブ変数url_effective
はあなたが探しているものです。
何かのようなもの
curl -Ls -o /dev/null -w %{url_effective} http://google.com
詳細情報
-Lリダイレクトに従います -sサイレントモード。何も出力しない -o FILE stdout -wの代わりに出力を<file>に書き込みます。FORMAT完了後に出力するもの
その他
追加したい場合があります -I
(大文字のi
)も同様です。これにより、コマンドは「ボディ」をダウンロードしなくなりますが、HEADメソッドも使用します。質問に含まれるものではなく、サーバーの動作を変更するリスクがあります。サーバーは、GETに正常に応答しても、HEADに応答しない場合があります。
おかげで、それは私を助けました。いくつかの改善を行い、それをヘルパースクリプト「finalurl」にラップしました。
#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
/dev/null
これにより、次のような他のスクリプトからコマンドを呼び出すことが可能になりました。
echo `finalurl http://someurl/`
通常はwgetでこれを行うことができます。 wget --content-disposition
「url」を追加する場合は追加-O /dev/null
実際にファイルを保存することはありません。
wget -O /dev/null --content-disposition example.com
別のオプションとして:
$ 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>
しかし、最初のものを超えることはありません。
ありがとうございました。私はあなたの提案を実装することになりました: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サイトがリダイレクトしない場合は空白を返しますが、連続したリダイレクトで機能するので十分です。
バギーになる可能性がありますが、一見すると大丈夫です。
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
これはうまくいくでしょう:
curl -I somesite.com | Perl -n -e '/^Location: (.*)$/ && print "$1\n"'
パラメーター-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リンク
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
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