HTTPリダイレクト完全ガイド

目次

HTTPリダイレクトとは

HTTPリダイレクト(URLリダイレクション)は、ユーザーをあるURLから別のURLに自動的に転送する仕組みです。ページをリクエストすると、サーバーが3xxステータスコードと新しいアドレスを指すLocationヘッダーで応答し、ブラウザがそのアドレスに自動的にアクセスします。

リダイレクトは多くの場面で使用されます:

リダイレクトの仕組み

クライアントリクエスト:
GET /old-page HTTP/1.1
Host: example.com

サーバーレスポンス:
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-page

リダイレクトの種類

301 Moved Permanently

301は最も一般的なリダイレクトタイプです。リソースが新しいURLに恒久的に移動したことをクライアントと検索エンジンに伝えます。

✅ 301を使うべき場面

  • 恒久的なドメイン移行
  • 恒久的なURL構造の変更
  • HTTP → HTTPSへのアップグレード
  • 重複コンテンツの統合

SEO: 検索エンジンはリンク評価(PageRank)を新しいURLに引き継ぎ、インデックスを更新します。Googleは通常数週間以内にこれを完了します。

ブラウザの動作: ブラウザは301リダイレクトをキャッシュし、以降のアクセスで元のURLをスキップする場合があります。

302 Found(一時的)

302一時的な移動を示します。元のURLは有効なままインデックスに保持されます。

✅ 302を使うべき場面

  • メンテナンスページ
  • A/Bテスト
  • 地域ベースの一時的なルーティング
  • 短期的なモバイル/デスクトップ振り分け

303 See Other

303は、元のリクエストメソッドに関係なく、リダイレクト先をGETで取得するようクライアントに強制します。主にPOST送信後のフォーム再送信を防ぐために使用されます(Post/Redirect/Getパターン)。

307 Temporary Redirect

307は302と似ていますが、元のリクエストメソッドを厳密に保持します。POSTはリダイレクト後もPOSTのままです — 歴史的にメソッド変更を許容していた302とは異なります。

308 Permanent Redirect

308は301のメソッド保持版です。GETリクエストの場合、301と308の動作は同じです。リクエストメソッドを変更してはならない恒久的なリダイレクトが必要な場合に308を使用します。

クライアントサイドリダイレクト

Meta refresh

<meta http-equiv="refresh" content="0; url=https://example.com/new-page">

SEOには不向き — 検索エンジンが正しく処理できない場合があります。

JavaScriptリダイレクト

window.location.href = "https://example.com/new-page";

クローラーがJavaScriptを実行しない場合があるため、SEOには理想的ではありません。

⚠️ クライアントサイドリダイレクトの制限

クライアントサイドリダイレクトはHTTPステータスコードを持たないため、検索エンジンは移動が恒久的か一時的かを判断できません。常にサーバーサイドリダイレクトを優先してください。

使い分けの指針

SEOへの影響

リンク評価の引き継ぎ

301リダイレクトはリンク評価のほぼすべてを新しいURLに引き継ぎます。Googleは301がPageRankの約100%を引き継ぐと述べています。302は評価を引き継がず、元のURLがランキングシグナルを保持します。

インデックス更新のタイムライン

301設定後、Googleは通常:

リダイレクトチェーンの影響

チェーン内のホップが増えるたびに(A → B → C)、レイテンシが増加し評価が希薄化する可能性があります。Googleは約10ホップまでたどりますが、3を超えるチェーンは問題のサインです。常に元のURLから最終的なリダイレクト先に直接リダイレクトしてください。

🎯 ベストプラクティス

直接リダイレクト(A → C)を使用してください。チェーンを定期的に監査し、可能な限り短縮しましょう。

よくある問題と対処法

1. リダイレクトループ

症状: ブラウザに「リダイレクトが多すぎます」と表示される。

よくある原因: CDN/オリジン間のHTTPS設定の競合、WordPressのsiteurl設定の誤り、Nginx/Apacheのリライトルールの重複、.htaccessの設定ミス。

# curlで診断
curl -I -L https://example.com

または301check.comでチェーン全体を可視化できます。

2. クエリ文字列の消失

リダイレクトルールでクエリパラメータが保持されるようにしてください。Nginxでは$request_uriまたは$is_args$argsを使用します。

3. キャッシュされた301

ブラウザは301リダイレクトをキャッシュします。リダイレクトを変更しても、ユーザーには古いリダイレクト先が表示される場合があります。プライベートウィンドウでテストするか、キャッシュをクリアしてください。

4. モバイルリダイレクトの不一致

モバイルユーザーが対応するモバイルページではなくホームページにリダイレクトされる場合は、URLマッピングを修正するか、レスポンシブデザインに切り替えてください。

ベストプラクティス