あにゃろぐ

インフラSEの資格対策だったり技術メモだったり。最近は専ら株主優待収集家。

Apacheのリダイレクト設定のテストを自動化する

以前、Apacheにリダイレクト設定を大量(1000件超)に設定することがありました。
1000件超の定義を1件ずつブラウザ打鍵してテストするのはあまりにしんどく、テストを自動化(スクリプト化)したので、その際のやり方をメモしておきます。

やり方

リダイレクト先のURLはHTTPレスポンスヘッダのLocationヘッダに格納されるため、curlコマンドでリダイレクト元URLにリクエストを投げて、レスポンスヘッダのLocationヘッダの情報を拾います。
curlコマンドの-Lオプションをつけておくことで、多段リダイレクトが発生したら最終的なリダイレクト先を拾うようにします。

スクリプトのインプットとして、テスト対象URL(リダイレクト元URL)を記載したテキストファイル(redirect_from_list.txt)を作成し、スクリプト本体と同ディレクトリに配置しておき、以下のようにスクリプト実行。

./redirect_test.sh redirect_from_list.txt redirect_to_list.txt

アウトプットは、リダイレクト先URLの一覧(redirect_to_list.txt)です。
この一覧をExcelなどに貼り付けて、期待する結果と一致するか確認。
1000件超の定義も数分でテストが完了するので、後日設定変更が発生した際のノンデグ確認もサクサクできます。

スクリプト本体

#!/bin/bash
#=====================================================================
# シェル概要: 引数で指定したリストファイルに記載されたURLのリダイレクト先を判定し、出力ファイルに出力する。
# 
# 実行形式 : redirect_test.sh $1 $2
# 
# 第一引数 : リダイレクト元リストファイル
# 第二引数 : リダイレクト先リストファイル
#=====================================================================
INPUT_FILE=$1
OUTPUT_FILE=$2
REDIRECT_TO=""

#=================================================
# 前処理
#=================================================
# 入力ファイル存在チェック
if [! -e ${INPUT_FILE}]; then
    echo "${INPUT_FILE}が存在しません。"
    exit 2
fi

# 出力ファイル削除
rem -f ${OUTPUT_FILE}

#=================================================
# 本処理
#=================================================
while read LINE
do
    if ["${LINE}"==""]; then
        # 入力ファイルが空行の場合、出力ファイルにも空行を出力する
        echo -e "" >> ${OUTPUT_FILE}
    else
        # 入力ファイルが空行でない場合、curlコマンドでリダイレクト先を判定する
        REDIRECT_TO=`curl -ILsS ${LINE} | grep -i Location | tail -1`
        
        if [${REDIRECT_TO}==""]; then
            # リダイレクト判定の結果が空の場合、リダイレクトは発生していないため、入力ファイルの内容をそのまま出力する
            echo -e "${LINE}" >> ${OUTPUT_FILE}
            
        else
            # リダイレクト判定の結果が空でない場合、リダイレクトは発生しているため、リダイレクト先のURLを出力する
            echo -e "${REDIRECT_TO}" | awk '{print $2}' >> ${OUTPUT_FILE}
        fi
    fi
done < ${INPUT_FILE}

#=================================================
# 後処理
#=================================================
# 特になし

exit

インプットファイル(イメージ)

https://aaa/aaa/aaa
https://bbb/bbb/bbb
https://ccc/ccc/ccc

アウトプットファイル(イメージ)

https://xxx/xxx/xxx
https://yyy/yyy/yyy
https://zzz/zzz/zzz

制約事項

curlコマンドを使用しているため、多段リダイレクトの途中にJavaScriptによるリダイレクトが混ざっていたりすると最終的なリダイレクト先が得られません。
途中にJavaScriptによるリダイレクトが混ざっているようなURLは仕方ないので、個別にブラウザ打鍵しました。

awkいいよね!/