curlでリダイレクトを追跡する

curlの-Lフラグを使ったHTTPリダイレクトの処理方法を解説。リダイレクトチェーン、ステータスコード301/302/307/308、最大リダイレクト数制限、メソッド保持ルールを学びましょう。

General

詳細な説明

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を解決する必要がある場合に使用します。

Try It — Curl to Code Converter

フルツールを開く