cURLリダイレクトを追跡し、すべてのURLを取得します。

cURLリダイレクトを追跡し、すべてのURLを取得します。

私はURLのリストを取得し、各URLのいくつかのデータ(URL、ステータスコード、およびターゲットURL)を含むCSVを出力する単純なbashスクリプトを作成しました。

while read url
do
    urlstatus=$(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out '%{http_code} , %{redirect_url}' "$url" -I )
    echo "$url , $urlstatus" >> "$1-out.csv"
done < $1

時にはURLに2〜3個のリダイレクトがあり、すべてのリダイレクトを取得して出力ファイルに印刷したい場合があります。

-L最後のURLのオプションとフィルタが見つかりました。%{url_effective}

    urlstatus2=$(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out ' , %{url_effective}' "$url" -L -I )

しかし、開始アドレスから最終アドレスまですべてのURLを持ってcsvに追加したいと思います。

ベストアンサー1

再帰関数を作成します。

#!/bin/bash
get_redirects(){
    i=${2:-1}
    read status url <<< $(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out '%{http_code}\t%{redirect_url}\n' "$1" -I)
    printf '%d: %s --> %s\n' "$i" "$1" "$status";
    if [ "$1" = "$url" ] || [ $i -gt 9 ]; then
        echo "Recursion detected or more redirections than allowed. Stop."
    else
      case $status in
          30*) get_redirects "$url" "$((i+1))"
               ;;
      esac
    fi
}

使用法:

$ get_redirects https://aep-beta.onpc.fr/lycees/dom/region/DOM/ECOL
https://aep-beta.onpc.fr/lycees/dom/region/DOM/ECOL --> 301
https://aep-beta.onpc.fr/onglet/lycee/dom --> 301
https://aep-beta.onpc.fr/onglet/lycee/outre-mer --> 200

おすすめ記事