curlでリダイレクトを追跡する
curlの-Lフラグを使ったHTTPリダイレクトの処理方法を解説。リダイレクトチェーン、ステータスコード301/302/307/308、最大リダイレクト数制限、メソッド保持ルールを学びましょう。
詳細な説明
curlでリダイレクトを追跡する
デフォルトでは、curlはHTTPリダイレクトを追跡しません。サーバーが3xxステータスコードで応答した場合、curlはリダイレクトレスポンスをそのまま表示します。-L フラグを指定すると、curlがリダイレクトチェーンを追跡するようになります。
基本的なリダイレクト追跡
curl -L https://example.com/old-page
-L を指定しないと、Location ヘッダー付きの301/302レスポンスが表示されます。-L を指定すると、curlは Location ヘッダーで指定されたURLに自動的に新しいリクエストを送信します。
リダイレクトステータスコードの理解
- 301 Moved Permanently: リソースが恒久的に移動。ブラウザはこれをキャッシュする
- 302 Found: 一時的なリダイレクト。今後のリクエストには元のURLを使用すべき
- 303 See Other: POST後のリダイレクト。リダイレクトされたリクエストはGETになる
- 307 Temporary Redirect: 302と同様だが、HTTPメソッドが保持される
- 308 Permanent Redirect: 301と同様だが、HTTPメソッドが保持される
リダイレクト回数の制限
--max-redirs で無限リダイレクトループを防止します:
curl -L --max-redirs 5 https://example.com/page
デフォルトの最大値は50回です。-1 で無制限に設定できますが、推奨されません。
リダイレクトチェーンの確認
-v を使ってチェーン内の各リダイレクトを確認します:
curl -L -v https://example.com/short-link 2>&1 | grep "< HTTP\|< Location"
または -w でリダイレクト情報を出力します:
curl -L -s -o /dev/null -w "Final URL: %{url_effective}\nRedirects: %{num_redirects}\n" \
https://example.com/short-link
POSTとリダイレクト
POSTリクエストからのリダイレクト追跡時、curlはデフォルトでメソッドをGETに変更します(ブラウザの動作と同じ)。リダイレクトを通じてPOSTメソッドを保持するには、--post301、--post302、--post303 を使います:
curl -L --post301 -X POST -d '{"key":"value"}' \
-H "Content-Type: application/json" \
https://api.example.com/endpoint
認証付きリダイレクト
デフォルトでは、curlは異なるホストにリダイレクトする際にAuthorizationヘッダーを削除します。--location-trusted を使うと、すべてのリダイレクト先に資格情報を送信します:
curl -L --location-trusted -u user:pass https://example.com/redirect
--location-trusted は資格情報がサードパーティサーバーに公開される可能性があるため、注意して使用してください。
ユースケース
URL短縮サービスやAPIゲートウェイを扱う開発者が、認証ヘッダーを保持しながら複数のリダイレクトホップを経て最終的な宛先URLを解決する必要がある場合に使用します。