カール。リダイレクトの確認

カール。リダイレクトの確認

link1、link2、link3の3つのリンクがあるとします。 link1はlink2にリダイレクトされ、link2はlink3にリダイレクトされます。それでは、カールを使ってどうやって見ることができますか?

答え1

を使用してHTMLヘッダーを表示できます-I。リダイレクトがメタリフレッシュの場合は、タイトルを次のように指定する必要があります。

curl -I http://google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Thu, 21 Nov 2013 14:59:13 GMT
Expires: Sat, 21 Dec 2013 14:59:13 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic 

リダイレクトがPHP経由で発生した場合は、ブラウザが実際に移動している場所を比較してそれを検出できます。 Python、JSなどを使用してこれを達成する方法はいくつかあります。あなたが興味を持っているプロジェクトの一つは、phantomjsスクリプト可能なヘッドレスブラウザです。

答え2

からman curl

   -w, --write-out <format>
          Defines what to display on stdout after a completed and
          successful operation.

          <...>

          redirect_url   When an HTTP request was made without -L to
                         follow redirects, this variable will show the 
                         actual URL a redirect would take you to.
                         (Added in 7.18.2)

これにより、curl -w "%{redirect_url}" link1最初のリダイレクトURLを提供できます。

おそらく次のようなものがあなたに役立ちます:

URL="http://google.com"
while [ -n "${URL}" ]
do
    echo $URL
    URL=$(curl -sw "\n\n%{redirect_url}" "${URL}" | tail -n 1)
done

答え3

この試み:

for link in link1 link2 link3; do
    curl -Is "$link" | awk '/Location/{print $2}'
done

または使用:

for link in link1 link2 link3; do
    printf '%s\n%s\n\n%s\n' 'HEAD / HTTP/1.1' "Host: $link" 'Connexion:close' |
    netcat $link 80 | awk '/Location/{print $2}'
done

答え4

この記事を書いた時点で、DebianシステムとmacOSでは、「location」は小文字でなければならず、偽の肯定を避けるために一致文字列はより具体的でなければならないため、@Gillesが提案するawkソリューションは次のようになります。

for link in link1 link2 link3; do
    curl -Is "$link" | awk '/^location/{print $2}'
done

関連情報